最简单的程序是
int main(){
int x;
scanf("%d",x);
}
当我们给该程序任何数值作为输入时,它会产生一个段错误信号而失败,这是我们所期望的。
但是,如果我们改为给它任何字母数字值,则它不会失败。
scanf
中发生这种情况的情况是什么?这是使用数值运行gdb时的回溯:
(gdb) bt
#0 0x00000034e7456ed0 in _IO_vfscanf_internal () from /lib64/libc.so.6
#1 0x00000034e74646cd in __isoc99_scanf () from /lib64/libc.so.6
#2 0x0000000000400553 in main ()
那么,为什么对于“ a”或“ dfgb”之类的任何字母数字值都不会失败?
最佳答案
该标准的第7.21.6.2/10条说:
如果输入项不是匹配序列,则执行
指令失败:此条件是匹配失败。
和7.21.6.2/4:
fscanf函数依次执行格式的每个指令。
执行完所有指令后,或指令执行失败时(例如
详见下文),该函数返回。失败被描述为输入
失败(由于发生编码错误或
输入字符不可用)或匹配失败(由于
输入不当)。
由于您的输入没有提供良好的可解析整数,因此scanf
只会返回0,以表示未从输入进行任何转换,因此请勿尝试取消引用您传递的参数。
编辑此答案是为了引用关于这一点的标准,这要感谢@Zwol。