将int转换为char *时的奇怪输出

时间:2013-10-10 13:37:52

标签: 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 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的长度)

5 个答案:

答案 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种方法。不确定导致问题的原因