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

fscanf和fgets用法的更多相关文章

  1. 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)

    函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...

  2. C++之函数fgetc和fputc、fgets和fputs、fread和fwrite、fscanf和fprintf用法小结

    #include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int ...

  3. 文件字符读写函数fscanf()和 fgets() 比较

    一. 文件格式化读入函数 fscanf()  int  fscanf(文件指针,格式化字符串,输入列表); 返回值: 整形,输入列表中定义字符串的个数. 1, 例如读取字符串: char  str1[ ...

  4. fscanf函数的用法

    fscanf函数用法 简要介绍 fscanf()函数是格式化读写函数.它读取的对象是磁盘文件 函数原型: int fscanf(FILE * fp,char * format,...); 其中fp为文 ...

  5. fscanf()函数基本用法

    FILE *fp; while(!feof(fp)) { fscanf(fp,"%s%d%lf",a,&b,&c);//这里%s对应的a不需要加上取地址符号& ...

  6. Linux C 文件输入输出函数 fopen()、getc()/fgetc()、putc()/fputc()、fclose()、fprintf()、fscanf()、fgets()、fputs()、fseek()、ftell()、fgetpos()、fsetpos() 详解

      fopen(打开文件) 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明 参数path字符串包含欲打开的文件路径及文件名,参 ...

  7. c/c++读取一行可以包含空格的字符串(getline,fgets用法)

    1.char[]型 char buf[1000005]; cin.getline(buf,sizeof(buf)); 多行文件输入的情况: while(cin.getline(buf,sizeof(b ...

  8. c语言中gets ,getschar 和fgets 的用法及三者之间的差别,还有scanf

    ①gets [1]函数:gets(字符指针) [2]头文件:stdio.h(c中),c++不需包含此头文件 [3]原型:char*gets(char*buffer); [4]功能:从stdin流中读取 ...

  9. C语言对文件的操作函数用法详解2

    fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const  ...

随机推荐

  1. HPE IT 的DevOps 实践分享

    原文地址:http://www.codes51.com/article/detail_3124576.html 本篇文章来自于HPE和msup共同举办的技术开放日HPE测试技术总监肖俊的分享,由壹佰案 ...

  2. 电容有什么作用?为什么cpu电源引脚都并联一个电容?

    管理 随笔- 17  文章- 1  评论- 1  电容有什么作用?为什么cpu电源引脚都并联一个电容?   正文: 参考资料:http://blog.sina.com.cn/s/blog_7880d3 ...

  3. 如何用openssl命令行生成证书

    老大要我在web server里面加上https功能,可是但就使用openssl生成证书就耗费了我两天时间,网上有很多相关的资料,但是都写的很复杂, 照着他们的来,还是走了很多弯路. 我总结一下,步骤 ...

  4. openssl生成https证书

    openssl生成https证书 分类: 其它2009-09-03 16:20 452人阅读 评论(0) 收藏 举报 includemoduleaccessapachessl服务器 openssl生成 ...

  5. Controller层返回字符串

    刚开始练习,有时候想让Controller层返回一个字符串,但是他却去寻找这个字符串名字的jsp页面,结果肯定会是404的,研究了一会才明白过来,如果Controller需要返回一个值的话,需要再方法 ...

  6. Hadoop--设置单一节点集群

    目的 这篇文档描述如何安装和配置一个单一节点的Hadoop,以便你可以快速使用hadoop mapreduce和Hadoop Distributed File System (HDFS)的一些简单操作 ...

  7. javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:

    javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity pas ...

  8. PowerBuilder -- 条码打印

    # 使用ocx控件 使用微软的MSBCODE9.OCX,但是注册老不成功,需要安装office之后才能注册成功,不知道有没有好的处理方法?? # 使用字体 字体下载:http://download.c ...

  9. hive job oom问题

    错误信息例如以下:Container [pid=26845,containerID=container_1419056923480_0212_02_000001] is running beyond ...

  10. PHP操作:将数据库中的数据保存到Word、Excel中。

    1.首先要把word.excel表放到文件的根目录下 2.定义了一个word类 <?php class word { function start() { ob_start(); ob_star ...