fscanf和fgets用法
首先要对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用法的更多相关文章
- 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)
函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...
- C++之函数fgetc和fputc、fgets和fputs、fread和fwrite、fscanf和fprintf用法小结
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int ...
- 文件字符读写函数fscanf()和 fgets() 比较
一. 文件格式化读入函数 fscanf() int fscanf(文件指针,格式化字符串,输入列表); 返回值: 整形,输入列表中定义字符串的个数. 1, 例如读取字符串: char str1[ ...
- fscanf函数的用法
fscanf函数用法 简要介绍 fscanf()函数是格式化读写函数.它读取的对象是磁盘文件 函数原型: int fscanf(FILE * fp,char * format,...); 其中fp为文 ...
- fscanf()函数基本用法
FILE *fp; while(!feof(fp)) { fscanf(fp,"%s%d%lf",a,&b,&c);//这里%s对应的a不需要加上取地址符号& ...
- 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字符串包含欲打开的文件路径及文件名,参 ...
- c/c++读取一行可以包含空格的字符串(getline,fgets用法)
1.char[]型 char buf[1000005]; cin.getline(buf,sizeof(buf)); 多行文件输入的情况: while(cin.getline(buf,sizeof(b ...
- c语言中gets ,getschar 和fgets 的用法及三者之间的差别,还有scanf
①gets [1]函数:gets(字符指针) [2]头文件:stdio.h(c中),c++不需包含此头文件 [3]原型:char*gets(char*buffer); [4]功能:从stdin流中读取 ...
- C语言对文件的操作函数用法详解2
fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const ...
随机推荐
- git stash 保存当前工作状态
1. git stash 暂存当前工作状态 2. git stash list 查看暂存列表 3. git stash save 'title' 暂存工作状态并添加说明 4. git stash ...
- IE8 "开发人员工具" 无法使用,无法显示
经常使用IE8开发工具的开发人员可能会遇到这么一种去情况:按F12时任务栏里出现开发人员工具的任务,但是开发人员工具窗体不弹出,也不出现在IE8里,重装IE88后还是存在此问题. 解决办法其实非常简单 ...
- Android防止过快点击造成多次事件
问题 onClick事件是Android开发中最常见的事件. 比方,一个submitButton.功能是点击之后会提交一个订单, 则一般代码例如以下,当中submitOrder()函数会跳转到下一页进 ...
- erlang中的图片下载
问题如题,这是在一个群里问的一个的问题.其实就是http的Server的上传下载的功能. ibrowse:start().ibrowse:send_req("http://img1.gti ...
- 深入Asyncio(八)异步迭代器
Async Iterators: async for 除了async def和await语法外,还有一些其它的语法,本章学习异步版的for循环与迭代器,不难理解,普通迭代器是通过__iter__和__ ...
- ASP.NET动态网站制作(11)-- JQ(3)
前言:这节课主要是讲CSS作业,然后继续讲jQuery. 内容: 1.css作业讲解. 2.jq设置元素样式: (1)添加.删除css类别:$("div").addClass(& ...
- 【BZOJ4383】[POI2015]Pustynia 线段树优化建图
[BZOJ4383][POI2015]Pustynia Description 给定一个长度为n的正整数序列a,每个数都在1到10^9范围内,告诉你其中s个数,并给出m条信息,每条信息包含三个数l,r ...
- 【BZOJ2510】弱题 期望DP+循环矩阵乘法
[BZOJ2510]弱题 Description 有M个球,一开始每个球均有一个初始标号,标号范围为1-N且为整数,标号为i的球有ai个,并保证Σai = M. 每次操作等概率取出一个球(即取出每个球 ...
- EasyNVR如何实现跨域鉴权
EasyNVR提供简单的登录鉴权,客户端通过用户名密码登录成功后,服务端返回认证token的cookie, 后续的接口访问, 服务端从cookie读取token进行校验. 但是, 在与客户系统集成时, ...
- ptyhon ORM mongoengine
参考资料:http://www.tuicool.com/articles/bMvI7vN from mongoengine import * from datetime import datetime ...