最近大家都在反反复复纠结用EOF作为输入结束的问题,为了避免这种纠结演化成冬日里的悲伤情绪,计算机课代表呕心沥血,百度千度一万度,总算找到了答案。
大多数错误来自于一个误解,现纠正如下——
EOF不是一个字符或者数字什么的,而是scanf()函数的一个返回值。
所以scanf("%c",&c);再判断(c==EOF)的做法是无效的,因为scanf()根本不会把EOF当作一个字符写进c;
正确的判断条件应该写作以下形式
(scanf("%c",&c)==EOF)
可以看出EOF就是scanf()的返回值
下面提供用getchar()和scanf()写的两种版本的代码
1.
#include <stdio.h>
void main()
{
char c[1000];
int cpoint=0;
while (scanf("%c",&c[cpoint])!=EOF)
{
.....
}
2.
#include <stdlib.h>
#include <stdio.h>
void main()
{
char c[1000];
int cpoint=0;
while ((c=getchar())!=EOF)
{
.....
}
关于要按两次ctrl+Z的问题
这和scanf的读取机制有关:就是在输入流中如果存在有可读的字符,Ctrl+z就不会存放进输入缓冲区。
这个暂时没有办法解决,不过应该不是大问题
2 scanf返回值的问题
scanf("%d%d", &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF。
不经意中发现scanf()的返回值问题,自己试验和了解了一下,一些所知与各位分享;
void main()
{
int a;
int b;
int c;
int x;
printf("请输入三个整数:\n");
int x=scanf("%d%d%d",&a,&b,&c);
printf("%d\n%d\n",a,x);
}
1.scanf()函数有返回值且为int型。
2.scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
从上边的例子中可以得到验证,这里用变量x接收scanf()函数的返回值,并输出显示出来。当运行中输入三个整数:5 6 7则x的值为3;如果输入5 6 d(即给c 赋值不正确)则x的值为2;如果输入5 t d(即给b和c 赋值不正确)则x的值为1;如果输入d 5 2 则输出-858993460和0,也就是说第一个字符d输入错误,整个scanf没有收到输入值。
其实scanf()的返回值对我们来说也很有用的,比如我们在使用这个函数进行接收值时,我们很必要知道对要给赋值的变量是否正确的赋值成功了,所以可以使用if(scanf("%d,%d",&a,&b)==2)这样语句来判断是否正确的给所有的变量赋值了,正确的话才能使用这个变量参与运算,这样才能提高我们代码的安全性,所以这个返回值也是大有用途的
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppxl/20090319/163398.html)