【发布时间】:2017-01-01 13:42:54
【问题描述】:
如果我执行以下操作会发生什么
scanf("%d,%d", &i, &j);
并提供导致匹配失败的输入?它会将垃圾存储到j吗?
【问题讨论】:
-
你的意见是什么?
-
你有没有尝试过?你不理解函数的行为吗?
标签: c input scanf format-string
如果我执行以下操作会发生什么
scanf("%d,%d", &i, &j);
并提供导致匹配失败的输入?它会将垃圾存储到j吗?
【问题讨论】:
标签: c input scanf format-string
输入必须完全匹配提供的格式,scanf() 才能成功。
引用C11,第 7.21.6.2 章,fsacnf(),(强调我的)
除了在
%说明符的情况下,输入项(或者,在%n指令的情况下, count of input characters)被转换为适合转换说明符的类型。 如果 输入项不是匹配序列,指令执行失败:this 条件是匹配失败。除非*指示分配抑制, 转换的结果放在后面的第一个参数指向的对象中 尚未收到转换结果的格式参数。 如果此对象 没有合适的类型,或者转换的结果无法表示 在对象中,行为是未定义的。
和,
当所有指令 已执行,或如果指令失败(如下详述),则函数返回。
所以,综合以上案例,
对于像100, 200 这样的输入,扫描将成功。 i 和 j 都将分别保存给定的值 100 和 200。
对于像100 - 200 这样的输入,扫描将失败(匹配失败)并且j 的内容将保持不变,即j 没有分配任何值通过scanf()操作。
忠告:始终检查scanf()函数族的返回值,以确保函数调用成功。
【讨论】: