EOF读取字符如何停止

转自 https://www.cnblogs.com/engraver-lxw/p/7620142.html 和 https://www.cnblogs.com/xyl-share-happy/archive/2012/08/28/2660873.html

之前一直不知道 while(scanf("%d",&n)!=EOF) 这种怎么正常结束输出,后来尝试一个一个读取字符时遇到问题,就上网查了一下,就找到以上两篇文章,下面是我对一些测试结果。

先说明一下我用的是 vs2015

一,

        while((*(ps+i++)=getchar())!=EOF)
	{
		//isspace   判断空字符  9 10 11 12 13 32   
		if (s[i - 1] != 9 && s[i - 1] != 10 && s[i - 1] != 11 && s[i - 1] != 12 && s[i - 1] != 13 && s[i - 1] != 32)
			*(pt + j++) = *(ps + i - 1);
	}

 1,没有输入任何数据为前提  :EOF -> 回车 -> ctrl+z -> 回车   跳出循环

   2,ctrl+z -> 回车  跳出循环,由此和最后1 中EOF被读入字符中可知 , 1中与 是否输入EOF没有关系

所以得出 用 getchar的话是与 EOF没有关系的

二,

        while (scanf("%c", (ps + i++)) != EOF)
	{
		if (s[i - 1] != 9 && s[i - 1] != 10 && s[i - 1] != 11 && s[i - 1] != 12 && s[i - 1] != 13 && s[i - 1] != 32)
			*(pt + j++) = *(ps + i - 1);
	}

    这个需要 

 ctrl+z ->回车 -> ctrl+z -> 回车 

 三,

while (scanf("%s",s) != EOF)
{  
		
}

 这个需要

 ctrl+z ->回车 -> ctrl+z -> 回车 ->ctrl+z ->回车

总结:这几个不同的原因吗,暂时不知道

原文地址:https://www.cnblogs.com/asdfknjhu/p/12343015.html