转自 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 ->回车
总结:这几个不同的原因吗,暂时不知道