从while(scanf() != EOF)说到ACM OnlineJuge的评判原理

前言

之前在做课程设计时, 无意间想起了以前做ACM题常用的一行语句:

while(scanf("%d", &a) != EOF)

忽然间对这句话作用产生了好奇,想了半天终于有了一点结果。

1. EOF是什么东东?

EOF是一个宏,许多函数(包括scanf)在读文件读到末尾时,会返回EOF。[1]

2. while(scanf()!=EOF)流程图

先看看以前学过的3种循环语句的流程图:

===================================================================================

① for循环

for (表达式1; 表达式2; 表达式3)
{
    循环语句;
}

 SouthEast

 ② while循环

while (判断语句)
{
    循环语句;
}

  ![Image 1][] ![SouthEast 1][]

③ do-while循环

do
{
    循环语句;
}while(循环条件);

![SouthEast 2][]

===================================================================

显然,while (scanf("%d", &a) != EOF)不像以上任何一种的流程图,

那么while(scanf("%d", &a) != EOF)的流程图是怎样的?

应该是像下面这样:

while (scanf() != EOF)
{
    循环语句;
}

![SouthEast 3][]          

**3. OnlineJuge的评判时,**该语句的作用

OJ评判的原理应该是这样的:

输入:通过管道命令,将一个包含若干测试用例的文件作为【标准输入流】,所以需要while(scanf() != EOF)来判断测试文件是否读完。

输出:通过管道命令,将【标准输出流】,输出到一个文件中。

//输入输出
./prog < test_input > output_file

评判:将程序的【输出文件】与【正确答案文件】进行比对:如果一样,则返回程序正确提示;否则返回程序错误的提示。

**4. 本机运行程序时,**该语句的作用。

当在本机运行程序,运行while(scanf() != EOF)时,程序会进入阻塞状态,即,

运行到上面流程图中【temp = scanf("%d", &a)】这一句 时,程序会进入到阻塞状态——在这一语句处暂停。

那么如何在本机输入的时候达到EOF的效果呢?

Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF;

Windows中,Ctrl-Z表示EOF。[2]

5. 等效的语句

虽然该语句用起来很方便,却不太好理解,因此建议用以下等效的语句来代替该语句。

while (true)
{
    if (scanf("%d", &a) != EOF)
        break;
}

引用:

[1][EOF 百度百科][EOF]

[2][EOF是什么?][EOF 1]

[Image 1]:
[SouthEast 1]: http://img.blog.csdn.net/20140502221640937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGltYmVyd29sZl8yMDEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
[SouthEast 2]: http://img.blog.csdn.net/20140502222555593?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGltYmVyd29sZl8yMDEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
[SouthEast 3]: http://img.blog.csdn.net/20140502221756328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdGltYmVyd29sZl8yMDEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
[EOF]: http://baike.baidu.com/link?url=LYoKaV_9HDbzkMc9pSnhV3vXjwdsoQIocHldGHZU1rMgyFWzz4NmU9e9enuFc_lN
[EOF 1]: http://www.ruanyifeng.com/blog/2011/11/eof.html

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/18096493

/** * RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS. * LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/ /* var disqus_config = function () { this.page.url = PAGE_URL; // Replace PAGE_URL with your page's canonical URL variable this.page.identifier = PAGE_IDENTIFIER; // Replace PAGE_IDENTIFIER with your page's unique identifier variable }; */ (function() { // DON'T EDIT BELOW THIS LINE var d = document, s = d.createElement('script'); s.src = 'https://chenzz.disqus.com/embed.js'; s.setAttribute('data-timestamp', +new Date()); (d.head || d.body).appendChild(s); })();