如果我执行以下操作会发生什么?
scanf("%d,%d", &i, &j);
并提供导致匹配失败的输入?它会将垃圾存储到j
吗?
答案 0 :(得分:5)
输入必须完全匹配scanf()
提供的格式才能成功。
引用C11
,章节§7.21.6.2,fsacnf()
,(强调我的)
除了
%
说明符的情况外,输入项(或者在%n
指令的情况下, 输入字符数)转换为适合转换说明符的类型。 如果 输入项不是匹配的序列,指令的执行失败:这 条件是匹配失败。除非*
表示分配抑制,否则 转换结果放在下面第一个参数指向的对象中 尚未收到转换结果的format参数。如果是此对象 没有合适的类型,或者无法表示转换结果 在对象中,行为是未定义的。
和
当所有指令 已执行,或如果指令失败(详见下文),函数将返回。
所以,合并上述案例,
对于100, 200
之类的输入,扫描将会成功。 i
和j
都将分别保留给定的值100
和200
。
对于100 - 200
之类的输入,扫描将失败(匹配失败),j
的内容将保持不变,即j
未分配 scanf()
操作的任何值。
建议提示:始终检查scanf()
函数系列的返回值,以确保函数调用成功。