字符串的 C 打印导致奇怪的字符

C printing of string is resulting in weird characters

本文关键字:字符 打印 字符串      更新时间:2023-10-16

我正在尝试通过以下方式输出一个 int:

void the_int(int i)
{
     int lenghtOfInt = 0;
     int tempValue = i;
     while(tempValue >= 1)
     {
          tempValue/=10;
          lenghtOfInt++;
     }
     int currentDigit;
     char string[lengthOfInt];
     while(i>9)
     {
           currentDigit= i % 10;
           i = i/10;
           char ch = (char)(((int)'0')+currentDigit);
           string[lengthOfInt--] = ch;
     }
     string[lengthOfInt]= (char)(((int)'0')+i);
     function(str); //prints the string character by character
}

如果我在 i = 12 的情况下尝试这个函数,我会得到 à12ç。我做错了什么?

加入 21 世纪并使用std::string .

您正在访问下一行中的数组边界之外。

string[lengthOfInt--] = ch;

这会尝试访问不正确的索引lengthofInt

现在,忽略带有变量的数组声明,

char string[lengthOfInt];

声明具有从 0lengthofInt - 1 的索引的数组

此外,根据打印字符串的方式,末尾可能需要"\0"字符。虽然,如果你逐个角色地走,并且确定你的界限,那么它不是必需的,但仍然建议这样做。

C 中的所有字符串都必须以 nul 字节 (0) 结尾。 因此,首先将 1 添加到您在堆栈上分配的 char 数组的长度,然后在打印之前将 nul 字节添加到字符串中。

我认为这是一个家庭作业练习。 否则,您应该只使用 itoa 函数。

忽略使用

变量声明数组的事实(您应该使用动态分配或至少使用常量),char string[lengthOfInt];需要char string[lengthOfInt+1];并且您需要在 while 循环之前string[lengthOfInt] = '';。C 字符串以 NULL 结尾。

此外,为什么不直接printf("%d", i);