fscanf和fgets用法
首先要对fscanf和fgets这两个文件函数的概念有深入的了解,对于字符串输入而言这两个函数有一个典型的区别是: fscanf读到空格或者回车时会把空格或回车转化为/0(字符串结束符)而fgets函数则把空格(回车在下文解释)作为字符接收。 有这样一个例子: char str[13]; scanf("%s",str); 如果输入以下12个字符How are you?回车 实际上并不是把这12个字符加上/0送到数组str中,而只将空格前的“How”送到str中,由于把“How”作为一个字符串处理,因此在其后加/0。 现在我们来看一看在题目的第一个循环中,用gets函数接受字符串的情况。 1、输入“ABC回车DEF”。 现在我们来说以下fgets函数对于回车的处理方法。 fgets函数的定义是这样的: char *fgets(char *s,int n,FILE *fp) 当fgets读到回车符时,函数会结束,把回车符也作为一个字送入参数s指向的缓冲区(注意是缓冲区而不是内存),fgets()函数在读取结束后,再向缓冲区送一个/0字符,从而使缓冲区的字符成为C字符串。 也就是说fgets函数读到回车的时候,不象fscanf函数那样在内存中把回车转换/0,而是在缓冲区里面处理的。这样处理的结果是回车不起作用,也就是说当我们输入ABC回车DEF时,ABCDEF在内存中是连续存放的。所以在第二个循环输出时自然不会换行。 2、输入“I AM A STUDENT”,在字符中间加空格。 在第一次循环中,用fgets读入的结果是“I AM A STUDENT”,空格作为字符处理。那么在第二次循环中,用fscanf读入 “I AM A STUDENT”后将字符串中的空格转换为了/0,也就上将一个字符串分成了四个"I" "AM" "A" "STUDENT"。在这里可能有人要问,那么既然加了/0,为什么循环在读到/0还能继续呢?要注意的是循环的结束条件是EOF(文件结束)而不是/0(文件结束符)。 第一次输出"I" 遇到/0输出回车结束,继续判断循环条件发现文件并没有结束,那么继续输出"AM"和回车.......一直到"STUDENT"回车。 补充一个问题,如果想让"I" "AM" "A" "STUDENT"输出在同一行上程序应该怎么改? 答案就是:fscanf换成fgets(fp, str) 。
posted on 2015-11-23 11:53 zyz913614263 阅读(2401) 评论(0) 编辑 收藏 举报