C++ 将int转换为char时的奇怪输出*
我有一个int,我想获得一个包含该int的char*。我的代码是:C++ 将int转换为char时的奇怪输出*,c++,c,string,pointers,C++,C,String,Pointers,我有一个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
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=整数的长度)您需要以null结束字符串。C字符串是一系列字符,后跟一个
'\0'
,或空字符;这就是各种字符串处理函数如何知道字符串何时结束。如果没有空值,C标准字符串处理函数将继续读取字符串末尾以外的任何值
请记住分配一个额外字符,以便为空字符留出空间,并在末尾存储一个'\0'
:
char *str = new char[l+1];
str[l] = '\0';
顺便说一下,<代码>新< /Cord>是C++运算符。在C语言中,可以使用
malloc()
。在C++中,最好使用<代码> STD::String ,因为它处理分配内存,不需要null终止。 < P>你需要空终止你的字符串。C字符串是一系列字符,后跟一个'\0'
,或空字符;这就是各种字符串处理函数如何知道字符串何时结束。如果没有空值,C标准字符串处理函数将继续读取字符串末尾以外的任何值
请记住分配一个额外字符,以便为空字符留出空间,并在末尾存储一个'\0'
:
char *str = new char[l+1];
str[l] = '\0';
顺便说一下,<代码>新< /Cord>是C++运算符。在C语言中,可以使用
malloc()
。在C++中,最好使用<代码> STD::String ,因为它处理分配内存,不需要null终止。 < P>在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;
}
在字符[]的结尾处放置一个空字符。您在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;
}
您可以使用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;
}
}
您可以使用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;
}
}
<>这不回答你的问题(为什么你得到了有趣的输出,这是因为缺少一个空的终结符,其他答案正确地指出),但是由于你的问题是标记C++:C++中,你甚至不需要自己编写函数,你可能对<代码> STD:很好:OSTRIGSWATE/<代码>:
#include <sstream>
#include <string>
std::string toString(int x)
{
std::ostringstream stream;
stream << x;
return stream.str();
}
#包括
#包括
std::字符串到字符串(int x)
{
std::奥斯汀溪流;
Stase这不回答你的问题(为什么你得到了有趣的输出,这是因为缺少一个空的终止符,因为其他答案正确地指出)直接,但是由于你的问题是标记C++:C++中,你甚至不需要自己编写函数,你可以很好地用<代码> STD::OSTRIGSWORDS:
#include <sstream>
#include <string>
std::string toString(int x)
{
std::ostringstream stream;
stream << x;
return stream.str();
}
#包括
#包括
std::字符串到字符串(int x)
{
std::奥斯汀溪流;
String 垃圾> STD::CUT
垃圾> STD::CUT在STDLIB—ITOA-()中有一个函数,也就是说,你的字符串缓冲区Unnot null结尾。虽然OrdDealths>代码> ITOA不是标准函数。这是C还是C++问题?在C中,没有<代码>新< /C> >,但是在C++中,你不会使用<代码>新char []
-您可以使用普通的std::string
或std::vector
。尝试使用snprintf
。Re:“我想获得一个包含该int的字符*”-achar*
是指针;它不能包含int。您需要的是一个char
数组,其中包含该int
值的文本表示形式。stdlib-itoa()中有一个函数也就是说,你的字符串缓冲区US没有null结尾。@ OLD程序员>代码> ITOA不是标准函数。这是C还是C++问题?在C中,没有<代码>新< /C> >,但是在C++中,你不会使用<代码>新char []。
-您可以使用普通的std::string
或std::vector
。尝试使用snprintf
。Re:“我想获得一个包含该int的char*”—achar*
是一个指针;它不能包含int。您想要的是一个char
数组,其中包含该int
值的文本表示形式,但是,“存储空值,并在结尾存储一个'\0',这是同一件事,不是吗?:)@Moo Juice对不起,在第一句中我的意思是“分配一个额外的字符来存储空值”,而在第二句中我提到了实际存储空值。我的措辞有点不清楚,我会重写它。+1但是,”存储空值,并在结尾存储“\0”,这是同一件事,不是吗?:@Moo Juice对不起,在第一句中我的意思是“分配一个额外的字符来存储空值”,而在第二句中我提到实际存储空值。我的措辞有点不清楚,我会重写它。如果x<0
,log10(x)
将不起作用。OTOH,OP对此类x
也不起作用。如果x<0
,log10(x)
将不起作用。OTOH,OP对此类x
也不起作用。