while ( (scanf("%f",&a))!=EOF) 这是什么意思
while ( (scanf("%f",&a))!=EOF) 表示只要文件还有IO的输入,循环就可以继续进行。一旦输入介绍后scanf("%f",&a)函数的返回值就是EOF,于是while循环就结束了。
EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
扩展资料:
UNIX系统EOF的作用:
在 UNIX中,EOF表示能从交互式 shell (终端) 送出Ctrl+D (习惯性标准)。在微软的 DOS 与 Windows中能送出 Ctrl+Z。
在某些例子处理纯文字档案或从"字元设备"读入资料,微软MS-DOS的 shell或系统程序会加入ASCIIControl-Z字元到磁碟档案结束处 (尽管基本核心MSDOS.SYS档案写入呼叫从未附加 Control-Z)。
这是向下相容于一些奇特的CP/M功能,从CP/M 档案系统只能就记录的档案长度分配多少 128 位元 "记录"。MS-DOS 档案系统从一开始就能精确的记录档案的位元长度。
参考资料来源:百度百科-EOF
直到你在控制台输入Ctrl + Z,就退出退出while循环。
Ctrl + Z是强行终止~
Ctrl + D是结束输入。
(出处见参考资料)
当读入发生错误,或者是到达文件尾,scanf就会返回EOF这个宏的值。
while(scanf("%d%d",&a,&b)!=EOF),这个语句就是说,当读取没有到达文件尾的话,就不停的读取。
scanf 函数的返回值反映的是按照指定的格式符正确读入的数据的个数。如果输入数据与指定格式不符,则会产生输入错误。遇到输入错误,scanf函数会立即终止,返回已经成功读取的数据的个数。所以,通过scanf函数的返回值和指定输入数据的个数(由格式符决定)的比较,可以判断数据输入是否成功。
scanf("%d%d",&a,&b); 这个语句会去读两个整型到a, b。如果读取成功,应该返回2。就是它成功读取变量的个数。
论坛上很多人对scanf的不太了解,导致程序出错,我想把scanf的具体用法贴出来,希望大家可以共同进步,有什么不对的地方可以提出来。
int scanf(char *format,...);
这应该是scanf的标准形式。先说说关于他的返回值的问题。
库函数几乎都是有返回值的,有些人可能很奇怪,怎么很少人用过scanf的返回值呢?
scanf会返回成功接收到的变量数量的值。比如scanf("%d",&j"),与scanf("%d=",&j),如果接受成功的话返回值都是1
我用如下语句作了测试
#include <stdio.h>
int main (){
int j;
printf ("%d",scanf("%d\n",&j));
return 0;
}
如果你开始就输入回车,程序会继续等待你输入,因为在输入数字的时候,scanf会跳过空白字符。(the c programming language 上说,scanf实际上是用getchar()接受由数字组成的字符串,再转换成数字)
如果我输入ctrl-z(unix上是ctrl-d)则会返回-1(随编译器而定).这实际上就是常量EOF的值,也就是所谓的返回eof
如果我键入的不是数字返回值就是0。但是如果我输入浮点数,又会怎么样呢?
我举的例子中同样会返回1,但是缓冲区会留下垃圾,如果是scanf("%d%d",&a,&b);则会出错。
这是可以使用一个库函数fflush(stdin)来清除缓冲。不过貌似雨中飞燕大姐说这个用法是非标准的。K&R,只是说行为没有定义,但我们可以使用while((c=getchar())!='\n'&&c!=EOF);同样可以清除后面的垃圾
scanf的格式匹配还是比较简单,一定要记住的就是普通变量一定要加上&,否则编译器无法检测错误,但运行肯定会段错误。
┏━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 代 码 │ 意 义 ┃
┠————┼————————————————————————————┨
┃ %a │读浮点值(仅适用于 C99) ┃
┃ %A │读浮点值(仅适用于 C99) ┃
┃ %c │读单字符 ┃
┃ %d │读十进制整数 ┃
┃ %i │读十进制、八进制、十六进制整数 ┃
┃ %e │读浮点数 ┃
┃ %E │读浮点数 ┃
┃ %f │读浮点数 ┃
┃ %F │读浮点数(仅适用于 C99) ┃
┃ %g │读浮点数 ┃
┃ %G │读浮点数 ┃
┃ %o │读八进制数 ┃
┃ %s │读字符串 ┃
┃ %x │读十六进制数 ┃
┃ %X │读十六进制数 ┃
┃ %p │读指针值 ┃
┃ %n │至此已读入值的等价字符数 ┃
┃ %u │读无符号十进制整数 ┃
┃ %[ ] │扫描字符集合 ┃
┃ %% │读 % 符号(百分号) ┃
┗━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
前面都很简单,%p,%n很少用到,跳过。要输入%必须要在前面再加一个%,
重点来谈谈%s和%[]。%s是读入一个数组,他与gets的区别就在于%s会以任何的空字符结束,而gets是回车结束。
同样%s前可以加数字,表示只读多少个。
ANSI C 标准向 scanf() 增加了一种新特性,称为扫描集(scanset)。 扫描集定义一个字符集合,可由 scanf() 读入其中允许的字符并赋给对应字符数组。 扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。 例如,以下的扫描集使 scanf() 读入字符 A、B 和 C:
%[ABC]
使用扫描集时,scanf() 连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。返回时,数组中放置以 null 结尾、由读入字符组成的字符串。
对于许多实现来说,用连字符可以说明一个范围。 例如,以下扫描集使 scanf() 接受字母 A 到 Z:
%[A-Z]
重要的是要注意扫描集是区分大小写的。因此,希望扫描大、小写字符时,应该分别说明大、小写字母。
对于%[]还可以用^+任意字符(包括eof)来结束字符串的输入。比如%[^EOF]就是直到有EOF输入,字符串才中止。
但一定要记住就是c语言是缓冲输入,即使你%[^a],再你输入回车之前输入多少的a都是不可能结束的。
%s的输入会跳过空白字符,但是%c则不会。
这也就是
scanf("%d",&h);
scanf("%c",&c);
如果这写的话,变量c放的一定是回车。
如果想实现这种输入,可以在两个语句之间加入一个getchar(),他可以吃掉这个回车,
也可用scanf("%d %c",&h,&c);来做,再输入数字后加一个空格。就可以了
但千万别用scanf("%d\n",&h)!!!!!!!!k&r说的十分清楚,任何非格式化的字符都需要完全匹配。
意味着,只有输入数字后面再加\n才是合法的。
还有就是*加在任何项的前面表示该项不符值,别的就没什么好说的了
小丁用scanf解决一个小问题
输入 3x +4y= 20,现在只想获取其中的数字, 同时避免 x + y = 20 造成错误,代码如下
if(scanf("%d",&a)==0) a=1;
if(scanf("%*[+ x]%d",&b)==0) b=1;
scanf("%*[y =]%d",&c);
参考资料: http://blog.sina.com.cn/s/blog_4d99abae0100dpxt.html
在 C语言,或更精确地说成 C标准函式库,档案存取或其它 I/O 功能可能传回等于象征符号值 (巨集) EOF 指示档案结束的情形发生。实际上 EOF 的值通常为 -1,但它依系统有所不同。巨集 EOF 会在编译原始码前展开实际值给预处理器。 C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
例如: #include <stdio.h>
int main()
{
int n; int array[25];
while (scanf("%d",&n)!=EOF)
{
for (int i=0; i<n; i++)
scanf("%d",array+i);
for (int i=0; i<n; i++)
printf ("%d ",array[i]);
}
return 0;
}
参考资料: http://baike.baidu.com/view/56074.htm