我有一个int,我想获得一个包含该int的char *。我的代码是:
int getLength(int x) {
int l = 0;
while(x) {
l++;
x /= 10;
}
return l;
}
char* toString(int x) {
int l = getLength(x);
char *str = new char[l];
l--; // the digits will be placed on positions 0 to l-1
while(l >= 0) {
str[l] = x % 10 + '0';
x /= 10;
l--;
}
return str;
}
部分结果:
toString(1009) = 1009Ä
toString(23) = 23L
为什么呢?我只为l个字符分配空间。 (l = int的长度)
答案 0 :(得分:10)
你需要null终止你的字符串。 C字符串是一系列字符后跟'\0'
或空字符;这就是字符串结束时各种字符串处理函数的知道方式。如果没有null,C标准字符串处理函数将继续读取超出字符串结尾的任何值。
请记住分配一个额外的字符,以便您有空的空间,并在最后存储'\0'
:
char *str = new char[l+1];
str[l] = '\0';
顺便说一句,new
是一个C ++运算符。在C中,您将使用malloc()
。在C ++中,使用std::string
可能更好,因为它处理分配内存而不需要空终止。
答案 1 :(得分:4)
在char []的结束处添加空字符。你在char []末尾看到的人物是垃圾值。
char* toString(int x) {
int l = getLength(x);
char *str = new char[l+1]; //+1 for null character
str[l]='\0'; // putting null character at the end of char[]
l--;
while(l >= 0) {
str[l] = x % 10 + '0';
x /= 10;
l--;
}
return str;
}
答案 2 :(得分:1)
这不能回答你的问题(为什么你得到那个有趣的输出,这是由于缺少空终止符,因为其他答案正确指出),但是因为你的问题被标记为C ++:在C ++中,你不会甚至不需要自己编写函数,使用std::ostringstream
:
#include <sstream>
#include <string>
std::string toString(int x)
{
std::ostringstream stream;
stream << x;
return stream.str();
}
答案 3 :(得分:0)
你可以使用log10获取int的长度,然后你需要在char数组的末尾加一个null
int getLength(int x) {
return ceil(log10(x));
}
char* toString(int x) {
int l = getLength(x);
char *str = new char[l+1]; //+1 for null character
str[l]='\0'; // putting null character at the end of char[]
while(l >= 0) {
str[--l] = x % 10 + '0'; // put the last digit in l - 1
x /= 10;
}
}
答案 4 :(得分:0)
垃圾-> std :: cout <<(字符)((((4 * 5 + 2)%10))<< std :: endl;
转换工程-> std :: cout <<(字符)((((4 * 5 + 2)%10)+ 48);
您需要添加48种方法。不确定导致问题的原因