#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
答案 0 :(得分: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中的最佳方式。例如this之类的内容。
答案 1 :(得分:1)
当您尝试将10个字符存储到最多可存储7个元素的缓冲区时,您有buffer overflow
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
。
答案 2 :(得分:0)
你的test
数组只有7个字符,而你通过for
循环读取10个字符。这可能会崩溃。
同样puts
将期望您的字符串以0结尾。你没有明确地在你的字符之后加一个0,所以输出将包含你的字符之后的垃圾,直到第一个0字节。
答案 3 :(得分:0)
您的字符串不以'\ 0'结尾。