首页 > 解决方案 > Scanf 读取超过预定义字符数组大小的字符串

问题描述

我正在尝试通过scanf如下方式读取字符串:

char input[8];
scanf("%s",input);

事实证明,该程序可以读取超过 8 个字符。假设我输入了 123456789012345,strlen(input) 返回 15。

但是,当我将输入设置为:

char input[4];
scanf("%s",input);

输入“12345”将导致“16146 分段错误”。有谁知道这是怎么回事?

标签: cstringcharscanf

解决方案


从技术上讲,这两种情况都会调用未定义的行为。第一种情况恰好在您的系统上工作不应该被认为意味着您的程序是定义良好的。测试只能表明错误的存在,而不是它们的缺失。

由于您仍在学习 CI,因此 CI 将借此机会为您提供有关从以下位置读取输入的建议stdin:始终将要读取的输入长度限制为正在读取的缓冲区的长度,在末尾保留一个位置空终止符。

如果您想使用scanf从 读取字符串stdin,那么在字符串格式说明符前面加上字符串的最大长度比使用 raw 更安全"%s"。例如,如果我有一个char buffer[20];作为调用目标的scanf,我将使用格式字符串"%19s"


推荐阅读