1

我有一个 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 的长度)

4

4 回答 4

10

您需要空终止您的字符串。C 字符串是一系列字符,后跟一个'\0', 或空字符;这就是各种字符串处理函数如何知道字符串何时结束的方式。如果没有 null,C 标准字符串处理函数将继续读取字符串末尾之后的任何值。

请记住分配一个额外的字符,以便为 null 留出空间,并'\0'在末尾存储 a:

char *str = new char[l+1];
str[l] = '\0';

顺便说一句,new是一个 C++ 运算符。在 C 中,您将使用malloc(). 在 C++ 中,使用 可能会更好std::string,因为它处理分配内存并且不需要空终止。

于 2013-10-10T13:39:32.630 回答
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;
}
于 2013-10-10T13:41:40.713 回答
1

这不能直接回答您的问题(为什么您会得到那个有趣的输出,这是由于其他答案正确指出的缺少空终止符),但是由于您的问题被标记为 C++:在 C++ 中,您甚至不会需要自己编写函数,你可能会很好std::ostringstream

#include <sstream>
#include <string>

std::string toString(int x)
{
    std::ostringstream stream;
    stream << x;
    return stream.str();
}
于 2013-10-10T13:58:25.143 回答
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;
        }
}
于 2013-10-10T13:52:35.357 回答