c - 字符数组后的奇怪字符

标签 c arrays string character scanf

我是 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

limit format specificer 的好处是,即使输入超过 5 个字符,也只会将 5 个字符存储到您的字符串中,始终为空终止符留出空间。

关于c - 字符数组后的奇怪字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577124/

相关文章:

c++ - 当从函数传递时如何在 gdb 中查看数组内容

c - c中函数调用期间的类型转换

c# - 将数组转换为内联字符串

c - Arduino 中的数组数组

string - 语言。我想检查字符串的内容是否符合条件。如何在速度方面有效地在 Go 语言中做到这一点?

string - golang 在编译时删除常量字符串中的字符(用于可读性)(空格,\n 和\t)

c - 从 C 中的字符串中删除最后四个字符

c - 链接 SDL2 在 OSX 上发出无数链接错误

javascript - ClojureScript 数组性能是否需要 mod - 或者只是关于边界检查?

C++从十六进制字符串转换为int时出错