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  阅读(2385)  评论(0编辑  收藏  举报

导航