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

Posted

技术标签:

【中文标题】将 int 转换为 char* 时的奇怪输出【英文标题】:Weird output when converting int to char* 【发布时间】:2013-10-10 13:37:52 【问题描述】:

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

【问题讨论】:

stdlib 中有一个函数 - itoa(),它可以做到这一点。此外,您的字符串缓冲区我们不是以空值结尾的。 @OldProgrammer itoa 不是标准函数。 这是一个 C 或 C++ 问题吗?在 C 中,没有 new,但在 C++ 中你不会使用 new char[] - 你会使用普通的 std::stringstd::vector<char> 尝试使用snprintf 回复:“我想获得一个包含该 int 的 char*” - char* 是一个指针;它不能包含 int。您需要的是一个 char 数组,其中包含该 int 的值的 文本表示 【参考方案1】:

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

记得分配一个额外的字符,以便为空值留出空间,并在末尾存储一个'\0'

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

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

【讨论】:

+1 但是,“存储空值,并在末尾存储一个'\0'”,这些是一回事,不是吗? :) @Moo-Juice 抱歉,在第一个子句中我的意思是“分配一个额外的字符来存储空值”,而在第二个子句中我提到实际存储它。我措辞的方式有点不清楚;我会重写它。【参考方案2】:

在 char[] 的 end 处放置一个 null 字符。您在 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;

【讨论】:

【参考方案3】:

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

#include <sstream>
#include <string>

std::string toString(int x)

    std::ostringstream stream;
    stream << x;
    return stream.str();

【讨论】:

【参考方案4】:

你可以使用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;
        

【讨论】:

如果x &lt; 0log10(x) 将不起作用。 OTOH,OP 也不适用于 x

以上是关于将 int 转换为 char* 时的奇怪输出的主要内容,如果未能解决你的问题,请参考以下文章

c ++奇怪的问题将char转换为int

Arduino 串行返回奇怪的数字 + 无法将 char 数组转换为 int C++

不兼容的转换字符

在java中将int转换为char

arduino int强制转换char

C++ 将 int 和 string 转换为 char*