【发布时间】:2014-12-14 10:03:19
【问题描述】:
#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 输出:你好
示例输入:Hellopeople 输出:Hellopep
【问题讨论】:
-
没有
gets,请忘记这个功能曾经存在过。 OTOHfgets活得很好,你应该使用它而不是你的手写循环,如果你没有用 NUL 字符终止你的字符串,原则上它可以工作。另外,故意溢出最多 10 个字符的 7 个字符长缓冲区是什么原因? -
UB 多重复制。不要超出数组边界,并注意 SO 是可搜索的。
-
@n.m.故意溢出只是为了在溢出的情况下检查 puts 的行为。你能解释一下为什么 puts() 应该只打印 7 个字符而打印更多的 8 个字符。以及为什么打印的字符是紧随其后的。
-
检查溢出是如何工作的没有什么意义,除非你知道事情是如何在没有溢出的情况下工作的。 (1) 去除溢出,恢复正常的非溢出行为。 (2) 谷歌“空终止字符串”是什么意思。在你接触 C 中的字符串之前,你需要熟悉这个概念。