为什么这是打破while循环的有效scanf语句?

问题描述 投票:1回答:3

为什么这是打破无限while循环的有效代码行?

if (scanf("%s", word) != 1) break;
c while-loop scanf
3个回答
0
投票

提到的break语句及其警戒是有效的,但它在说谎。考虑循环

while (1) {
   ...
}

根据结构化编程的规则,循环永远不应该退出,也就是说,除非程序退出。结构正确的程序应该使用功能scan的返回值作为循环保护,而不是使用break语句,如下所示:

tokenCount = scanf("%s", word);
while (tokenCount == 1) {
    ...
    tokenCount = scanf("%s", word);
}

如果表达式没有副作用,则更容易推断程序的正确性;这就是为什么返回值存储在变量中(具有有意义的名称)的原因。


0
投票
if (scanf("%s", word) != 1) break;

scanf返回成功消耗的项目数。在下面的示例中,如果没有I / O错误发生并且由于仅消耗一项而成功转换了字符串,则该值为1

[我猜这个if语句是循环的一部分,其意图是从输入中读取后续单词,直到遇到EOF中的stdin,因为条件才被评估为true(并且如果发生EOFI/O错误,因为在这种情况下scanf()返回了0,则发生中断。

尽管此表达式是有效的,但对于C语法,实际上它没有多大意义,因为scanf()在大多​​数现代终端上将无限期地等待新输入,而不会在EOF中寻找stdin

所以结果将是周围的循环变为无限,实际上永远不会终止。


-1
投票

printf()和scanf()的返回类型是整数。 prnitf()返回成功写入控制台的字符数,而scanf()返回成功读取的字符数

© www.soinside.com 2019 - 2024. All rights reserved.