C语言scanf("%f%c")接收输入`100e`时输出异常的原因是什么?
现象原因解释
这个差异是由C标准中scanf函数%f格式符的匹配规则决定的,核心逻辑如下:
%f匹配浮点数时遵循最长有效匹配原则,会尽可能多地读取符合浮点数语法规则的字符,科学计数法格式中e/E是浮点数的合法组成字符(用于分隔尾数和指数部分)。
输入100f的执行逻辑
%f扫描到字符f时,判断f不属于浮点数的合法组成部分,立即停止匹配,将已经读取的100解析为100.0赋值给变量f- 未被消耗的字符
f留在输入缓冲区,被后续的%c格式符读取并赋值给变量c - 最终打印时会同时输出浮点数和字符
f
输入100e的执行逻辑
%f扫描到字符e时,默认该字符是科学计数法的分隔符,会继续向后读取寻找指数部分(指数需要是可选正负号加数字序列)- 此时
e后没有符合要求的指数内容,%f匹配触发部分失败:已经读取的100是合法浮点数,会赋值给变量f,但e字符已经被%f的匹配逻辑消耗,同时整个scanf函数提前终止,不会继续执行后续%c的匹配逻辑 - 变量
c没有被赋值,最终打印时就不会出现e字符
关于100e是否是非法浮点数的说明
100e确实是非法的浮点数格式:合法的科学计数法要求e/E后必须跟随指数数字序列。但scanf的匹配逻辑不会因为后续存在非法后缀就否定前缀的合法性,且会消耗掉e字符用于尝试匹配指数部分,最终导致上述现象。
内容的提问来源于stack exchange,提问作者hengxin
相关产品推荐
相关产品推荐

