C语言中while语句里使用scanf的技巧

Posted nangcr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中while语句里使用scanf的技巧相关的知识,希望对你有一定的参考价值。

今天友人和我讨论了一段代码,是HDU的OJ上一道题目的解,代码如下

#include<stdio.h>
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        printf("%d\n",a+b);
    }
    return 0;
}

起初,我以为代码中while语句里的按位取反运算符写错了,应该是逻辑非运算符。

这时我在Quora上找到了类似的问题,我对其中一篇答案做了修改和翻译:

查阅scanf函数的man手册,关于返回值的说明如下

函数返回按照格式成功匹配并读入的输入项数量,并且可能会返回一个小于输入项总数的数字,而在匹配失败的情况下,甚至可能返回0。

如果在第一次成功读入或者发生匹配错误之前收到输入结束信号,将会返回EOF。在遇到读入错误的时候,也会返回EOF。

在上面的代码里,scanf的返回值可能是0,1,2或者EOF。

对0,1,2进行按位取反得到的都是非零值,此时while循环会继续执行。

在大多数环境里,EOF被定义为值为-1的常量,进行按位取反后得到的值为0.此时while循环将会结束。

综上所述,这个while语句可以不断从输入流读入数据,直到输入流结束,循环也就结束。

值得一提的是,这种用法仅仅在EOF被定义为-1的环境下有效,而且可读性很差。所以应该尽量避免使用它。

在Linux和OS X里,你可以通过Ctrl+D来发送一个输入结束信号,在Windows里你需要使用Ctrl+Z。

 

参考资料:

Quora上的回答

scanf(3)

以上是关于C语言中while语句里使用scanf的技巧的主要内容,如果未能解决你的问题,请参考以下文章

C语言while(scanf("%d",&num)==1);语句的一个问题

C语言scanf语句导致无法进入循环?

秋季学期学习总结

c语言请问while循环为啥执行不了?

C语言编程技巧(注意点)

c语言中用了scanf语句就输不出结果把scanf删掉就能出结果是为什么