为什么puts()最后会打印一个额外的字符?

时间:2014-12-14 10:03:20

标签: c arrays string puts

#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 个答案:

答案 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'结尾。