C++ 将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,我想获得一个包含该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=整数的长度)

您需要以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的字符*”-a
char*
是指针;它不能包含int。您需要的是一个
char
数组,其中包含该
int
值的文本表示形式。stdlib-itoa()中有一个函数也就是说,你的字符串缓冲区US没有null结尾。@ OLD程序员>代码> ITOA不是标准函数。这是C还是C++问题?在C中,没有<代码>新< /C> >,但是在C++中,你不会使用<代码>新char []。
-您可以使用普通的
std::string
std::vector
。尝试使用
snprintf
。Re:“我想获得一个包含该int的char*”—a
char*
是一个指针;它不能包含int。您想要的是一个
char
数组,其中包含该
int
值的文本表示形式,但是,“存储空值,并在结尾存储一个'\0',这是同一件事,不是吗?:)@Moo Juice对不起,在第一句中我的意思是“分配一个额外的字符来存储空值”,而在第二句中我提到了实际存储空值。我的措辞有点不清楚,我会重写它。+1但是,”存储空值,并在结尾存储“\0”,这是同一件事,不是吗?:@Moo Juice对不起,在第一句中我的意思是“分配一个额外的字符来存储空值”,而在第二句中我提到实际存储空值。我的措辞有点不清楚,我会重写它。如果
x<0
log10(x)
将不起作用。OTOH,OP对此类
x
也不起作用。如果
x<0
log10(x)
将不起作用。OTOH,OP对此类
x
也不起作用。