将字符与整数连接

3

我需要将字符和整数合并。下面是我的代码:

int count = 100;
char* name = NULL;
sprintf((char *)name, "test_%d", count);
printf("%s\n", name);

没有任何输出。问题出在哪里?


6
您需要为 name 分配一些存储空间。 - Paul R
5
请说明你正在使用哪种编程语言。在解决这个常见问题时,C和C ++有着截然不同的用法。 - Robᵩ
@Rob: 假设他会接受使用两种语言的习语来回答的答案,这样做是否安全呢? - Dietrich Epp
@Dietrich,如果你要使用C ++,那就按照C ++ 的方式去做。同样适用于C。 - Marlon
@Meng C和C++非常不同。请学习并确定您正在使用哪种语言,并仅在标签中指定该语言。在这种情况下,似乎您正在使用C,因为您不会在C++中使用printf。 - David Heffernan
6个回答

6

你没有分配任何内存来接收 sprintf 的结果。你可以尝试:

int count = 100;
char name[20];
sprintf(name, "test_%d", count);
printf("%s\n", name);

甚至可以这样做:
int count = 100;
char *name = malloc(20);
sprintf(name, "test_%d", count);
printf("%s\n", name);

当然,如果您的唯一目标是打印组合字符串,您可以这样做:
printf("test_%d\n", 100);

数组在32位机器上不需要超过[17]。 - Mooing Duck
真的。我必须比@MooingDuck更懒。 - Robᵩ

2
如果您在编程时使用C ++,请使用sstream:
stringstream oss;
string str;
int count =100

oss << count;
str=oss.str();

cout << str;

你没有检查流操作是否成功。 - Tom Kerr
stringstream << int 可能会失败而不抛出异常吗?(虽然还是建议进行检查) - Mooing Duck

1

你必须先为name分配内存。在C中,像sprintf这样的库函数不会为你做这件事。

实际上,我很惊讶你没有得到分段错误。

一个简单的解决方法是在32位int的情况下使用char name[5+11+1]


“重型”库函数(如snprintf)往往会进行相当多的错误检查,而不像“轻型”函数(如memcpy)。 - Dietrich Epp
@Dietrich:也许你是对的,但这仍然很奇怪。文档坚持认为“传递给str的数组大小应足以包含整个格式化字符串”,并且不特殊处理空指针。 - Vlad
int 可以达到 11 位数字:-2147483648(在 32 位上) - Mooing Duck

0
#include <iostream>
#include <string>
#include <sstream>  

int count = 100;

 std::stringstream ss;
 ss << "Helloworld";
 ss << " ";
 ss << count ;
 ss << std::endl;
 std::string str = ss.str();
 std::cout << str;

 const char * mystring = str.c_str();

0

我使用boost::format来实现这个。

#include <boost/format.hpp>

int count = 100;
std::string name = boost::str( boost::format("test_%1%") % count );

0

由于答案标记了C ++,因此这里介绍如何在该语言中完成:

C++11方法:std::string str = "Hello " + std::to_string(5);

使用Boost库方法:std::string str = "Hello " + boost::lexical_cast<std::string>(5);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接