2011-10-14 39 views
1

我必须连接字符与int。 这里是我的代码:连接字符与int

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

没有打印。有什么问题?

+6

您需要为'name'分配一些存储空间 –

+5

请指定您正在使用的编程语言。 C和C++在解决这个共同的问题上有很多不同的成语。 –

+0

@Rob:假设他会接受使用任何一种语言的成语的答案是不安全的吗? –

回答

1

您必须首先为name分配内存。在C中,库函数sprintf不会为你做。

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

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

+0

像“snprintf”这样的“重”库函数往往会进行大量的错误检查,而不是像“memcpy”这样的“轻量级”函数。 –

+0

@Dietrich:也许你是对的,但它很奇怪。 [documentation](http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/)坚持认为_作为str传递的数组的大小应该足以包含整个格式化的string_并且不是特例空指针。 – Vlad

+0

'int'可以达到11个数字:-2147483648(在32位) –

5

您没有分配任何内存,其中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); 
+0

在32位机器上,阵列不需要超过[17]。 –

+0

是的。我必须比@MooingDuck更懒。 –

2

如果您程序C++使用sstream代替:

stringstream oss; 
string str; 
int count =100 

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

cout << str; 
+0

您不检查流操作是否成功。 –

+0

'stringstream << int'失败而没有抛出异常? (不是说你不应该检查) –

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);

升压方式:std::string str = "Hello " + boost::lexical_cast<std::string>(5);

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();