-2
#include<stdio.h>
#include<conio.h>
int main()
{
char test [7];
for(int i=0;i<10;i++)
scanf("%c",&test[i]);
puts(test);
getch();
return 0;
}

我正在使用 DevC++(大学规则)并且我知道 gets() 没有边界检查,所以我故意使用 for() 循环来输入字符串。当我输入一个大于数组大小的字符串时,puts 正在打印一个额外的字符。为什么这样 ??

示例输入:helloworld 输出:hellowos

示例输入:Hellopeople 输出:Hellopep

4

4 回答 4

2

那是因为你的内存溢出了。你的数组只有七个字符,你尝试用十个填充它:

char test [7];             // Array indexes 0-6 allowed.
for(int i=0;i<10;i++)      // Array indexes 0-9 used.
    scanf("%c",&test[i]);

您可以使用以下方法修复它(包括允许使用字符串终止符):

char test [11];            // Array indexes 0-10 allowed.
for(int i=0;i<10;i++)      // Array indexes 0-9 used.
    scanf("%c",&test[i]);
test[10] = '\0';           // And add string terminator before puts().

如果您想要一个具有缓冲区溢出保护的强化用户输入功能,那么fgets()在标准 C 中构建的东西通常是最好的方法。例如,像这样的东西。

于 2014-12-14T10:06:57.923 回答
1

当您尝试将 10 个字符存储到最多可以存储 7 个元素的缓冲区中时,出现缓冲区溢出

char test [7];
for(int i=0;i<10;i++)
  scanf("%c",&test[i]);

您可以通过使缓冲区包含 10 个元素来解决此问题(以便它可以存储 9 个字符加上一个用于\0结尾的字符)并使用以下命令:

char test [10]; //10 elements long
scanf("%9s",test); //Get at-most 9 chars

或者你也可以使用fgets

于 2014-12-14T10:08:19.237 回答
0

您的字符串不以 '\0' 结尾。

于 2014-12-20T17:57:36.590 回答
0

您的test数组只有 7 个字符,而您通过for循环将 10 个字符读入其中。这可能会崩溃。

还将puts期望您的字符串以 0 结尾。您没有在字符后显式放置 0,因此输出将包含字符后的任何垃圾,直到第一个 0 字节。

于 2014-12-14T10:07:26.980 回答