字符数组后的奇怪字符

我是C的真正初学者,但我正在学习!

我之前偶然发现了这个问题,并决定询问原因是什么。 请解释一下你的答案,这样我才能学习。

我制作了一个程序,允许您输入5个字符,然后显示您编写的字符并还原它们,例如:“asdfg” – “gfdsa”。 奇怪的是,在输入的原始字符后显示一个奇怪的字符。

这是代码:

char str[5]; char outcome[] = "OOOOO"; int i; int u; printf("Enter five characters\n"); scanf("%s", str); for(i = 4, u = 0; i >=0; u++, i--){ outcome[i] = str[u]; } printf("\nYou wrote: %s. The outcome is: %s.", str , outcome); return 0; 

如果我输入:“asdfg”它显示:“asdfg♣”,为什么?

谢谢你的时间,请解释你的答案:)

因为没有空终止符。 在C中,“字符串”是一系列连续字节(字符),以一个称为空终止符( '\0' )的标记字符结束。 您的代码从用户那里获取输入并填充所有5个字符,因此您的字符串没有“结束”。 然后当你打印字符串时,它将打印你的5个字符( "asdfg" ),它将继续打印堆栈上的任何垃圾,直到它遇到空终止符。

 char str[6] = {'\0'}; //5 + 1 for '\0', initialize it to an empty string ... printf("Enter five characters\n"); scanf("%5s", str); // limit the input to 5 characters 

关于限制格式特定的好处是,即使输入超过5个字符,只有5个将存储到您的字符串中,总是为该空终止符留出空间。

你的字符串str[5]; 太短了。

它应该是

 str[6]; 

当你打印它时,代码超出了该数组的范围。

您还必须将一个空终止字符设置为str []数组以标记数组的结尾。

 str[5] = '\0'