scanf字段宽度字符串溢出

时间:2014-07-14 21:15:36

标签: c input scanf

关于缓冲区溢出,以下哪一项是安全的?

char buf[10] = {0};
scanf("%10s", buf);

char buf[10] = {0};
scanf("%9s", buf);

从我读过的内容来看,我要去的是第二个(sizeof减去一个),但问题非常微妙,而且我已经看到了代码建议。有志于引用标准的志愿者吗?

2 个答案:

答案 0 :(得分:12)

C standard表示:

  

输入项应定义为输入字节的最长序列(直到任何指定的最大字段宽度,可以用字符或字节来衡量,取决于转换说明符),它是匹配序列的初始子序列。 / p>

也就是说,最大字段宽度表示输入中可以有多少个字符。最后的额外零值不是输入的一部分,需要额外的空间。

GNU libc manual明确指出了这一点:

  

字符串输入转换存储空字符以标记输入的结尾;最大字段宽度不包括此终结符。

因此,唯一安全的版本是scanf("%9s", buf)

答案 1 :(得分:3)

char buf[10] = {0};
scanf("%10s", buf);

不安全。您必须考虑字符串null终止符。

char buf[10] = {0};
scanf("%9s", buf);

是安全的。