【发布时间】:2019-01-26 04:03:51
【问题描述】:
我正在尝试通过scanf 读取字符串,如下所示:
char input[8];
scanf("%s",input);
事实证明,该程序可以读取超过 8 个字符。假设我输入了 123456789012345,strlen(input) 返回 15。
但是当我将输入设置为:
char input[4];
scanf("%s",input);
输入“12345”会导致“16146 分段错误”。 有谁知道这是怎么回事?
【问题讨论】:
-
发生这种情况是因为您没有像应有的那样分别使用
"%7s"或"%3s"。 -
当输入的字符串长于存储它的可用空间时,您会遇到“未定义的行为”。任何事情都有可能发生。这包括崩溃并似乎可以工作,以及重新格式化您的磁盘驱动器。见How to prevent
scanf()causing a buffer overflow?。 -
您正在调用undefined behavior。这意味着从字面上看,任何事情都可能发生,包括崩溃,甚至时间旅行(是的,真的)。未定义的行为还包括您的程序看起来“工作正常”,但实际上,您只是走运了,当您进行通常不应该影响程序行为的最小更改时,您的程序可能会有不同的行为。仅仅因为你的程序看起来可以工作并不意味着它是格式良好的,并且当你编写一个格式不正确的程序时,也不能保证你会得到一个错误。