【问题标题】:Strange character after an array of characters字符数组后的奇怪字符
【发布时间】:2013-03-12 17:02:20
【问题描述】:

我是真正的 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 arrays string character scanf


【解决方案1】:

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

应该是

str[6];

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

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

str[5] = '\0'

【讨论】:

  • scanf() 会在处理 %s 格式说明符时为您设置终止符。也就是说,首先应该避免scanf()%s 结合使用,因为它是缓冲区溢出的明显危险。请改用fgets()
【解决方案2】:

因为没有空终止符。在 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 个字符存储到您的字符串中,始终为空终止符留出空间。

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多