2010-01-07 99 views
0

如何将一个整数变量添加到字符串和char *变量中?例如:
int a = 5;
string St1 =“Book”,St2;
char * Ch1 =“Note”,Ch2;将整数转换为字符串和字符*

St2的值= ST1 + A - > Book5两个
CH 2 = CH1 + A - >注5

感谢

+1

这功课吗?如果是,请添加家庭作业标签。正如Dirkgently所建议的,你需要有另一个字符串,然后你可以使用sprintf来使用St1和i创建字符串“Book5”。 – Jagannath 2010-01-07 10:16:06

回答

2

这样做的C++的方法是:

std::stringstream temp; 
temp << St1 << a; 
std::string St2 = temp.str(); 

你也可以做Ch1同样的事情:

std::stringstream temp; 
temp << Ch1 << a; 
char* Ch2 = new char[temp.str().length() + 1]; 
strcpy(Ch2, temp.str().c_str()); 
+0

'new char [temp.str().length()+ 1];'不是非常C++ ish,你知道 - 它是GCC使用的扩展。 – LiraNuna 2010-01-07 10:41:35

+0

出现了几个错误,首先是关于第一行。 – aryan 2010-01-07 10:44:04

+0

@LiraNuna嗯,以什么方式是一个GCC扩展?它只是'新闻'一系列的字符。 (我使用VC2005/2008,但代码在Comeau中工作正常,没有扩展名) – 2010-01-07 10:54:04

0

您需要创建另一个字符串大到足以容纳原始字符串跟数字(即将与该数字的每个数字相对应的字符附加到该新字符串)。

1

char*您需要创建另一个变量,它是足够长的时间都, 例如。您可以'修复'输出字符串的长度,以消除超出字符串末尾的机会。如果你这样做,要小心使这个数字足够大以保存整个数字,否则你可能会发现书+50和书+ 502都以书+50(截断)出现。

以下是如何手动计算所需的内存量。这是最有效的,但容易出错。

int a = 5; 
char* ch1 = "Book"; 
int intVarSize = 11; // assumes 32-bit integer, in decimal, with possible leading - 
int newStringLen = strlen(ch1) + intVarSize + 1; // 1 for the null terminator 
char* ch2 = malloc(newStringLen); 
if (ch2 == 0) { exit 1; } 
snprintf(ch2, intVarSize, "%s%i", ch1, a); 

CH2现在包含结合的文本。

另外,和略少棘手,也漂亮(但效率较低),你也可以做的printf的“试运行”,以获得所需的长度:

int a = 5; 
char* ch1 = "Book"; 
// do a trial run of snprintf with max length set to zero - this returns the number of bytes printed, but does not include the one byte null terminator (so add 1) 
int newStringLen = 1 + snprintf(0, 0, "%s%i", ch1, a); 
char* ch2 = malloc(newStringLen); 
if (ch2 == 0) { exit 1; } 
// do the actual printf with real parameters. 
snprintf(ch2, newStringLen, "%s%i", ch1, a); 

,如果你的平台包括asprintf,那么这要简单得多,因为asprintf自动为新字符串分配正确的内存量。

int a = 5; 
char* ch1 = "Book"; 
char* ch2; 
asprintf(ch2, "%s%i", ch1, a); 

ch2现在包含组合文本。

C++不那么烦琐,但我会留给他人来描述。

+0

错误C3861:'snprintf':标识符未找到。 – aryan 2010-01-07 10:51:22

+0

#include 应该可以解决这个问题,但是如果没有,那么你的编译环境会出现问题,或者你的平台可能不包含snprintf。这似乎不太可能,因为它是现有最重要的代码安全工具之一。 – 2010-01-07 12:50:14

-1
Try this out: 
char *tmp = new char [ stelen(original) ]; 
itoa(integer,intString,10); 

output = strcat(tmp,intString); 

//use output string 

delete [] tmp; 
+0

这是不安全的 - 因为strcat只是将更多的字节写入到原始字符串的末尾,这可能会覆盖附近的变量,从而导致程序故障或崩溃。另外,作者并没有要求修改原始字符串。 – 2010-01-07 10:32:51