C语言fgets()与fputs()详解
文章目录
- fgets()与fputs()
- 1⃣️fgets()优缺点:
- 2⃣️fgets()返回值:
- 3⃣️fgets()操作实例:
- 3⃣️fgets()操作进阶:
fgets()与fputs()
- fgets()函数的第二个参数指明了读入字符的最大数量。如果该参数为n,那么fgets函数将读入n-1个字符。如果fgets()函数读到一个换行符,会把它储存在字符串中。这点与gets不同,gets会丢弃换行符。fgets()函数的第三个参数指明要读入的文件。如果读入从键盘输入的数据,则以stdin作为参数。
- fputs()函数的第二个参数指明他要写入的文件。如果要在计算机显示器上打印,则使用stdout作为参数。与puts()函数不同,fputs()函数不会在待输出字符串末尾添加一个换行符。
例:
#include <stdio.h>
#define LEN 14
int main(void){char words[LEN];puts("Enter a String");fgets(words,LEN, stdin);puts(words); //puts()函数会添加换行符\nfputs(words, stdout);return 0;}
输入apple后,apple\n\0 被存储在数组中。
我们看到控制台输出的内容发现输出的两个apple之间有一行空白,因为puts()函数会添加换行符\n。
1⃣️fgets()优缺点:
fgets()储存换行符有好有坏
- 缺点是你可能并不想把换行符储存在字符串中,这样的换行符会带来一些麻烦。
- 优点是对于储存的字符串而言,检查末尾是否有换行符可以判读是否读取了一整行。如果不是一整行,要处理好一行中剩下的字符。
2⃣️fgets()返回值:
读取成功,返回读取到的字符串,即string;失败或读到文件结尾返回NULL。
下面的程序验证读到文件结尾返回NULL。读入并显示用户输入的内容,直到fgets()读到文件结尾或空行(即,首字符为换行符)。
3⃣️fgets()操作实例:
#include <stdio.h>
#define LEN 10
int main(void){char words[LEN];puts("Enter Strings (empty line to quit): ");while(fgets(words, LEN, stdin) != NULL && words[0] != '\n'){fputs(words, stdout);}puts("Done!");return 0;}
LEN设置的为10,所以fgets()一次读取9个字符(剩余一个字符留给’\0’),第一次读取到" I’m Kevin ",并存储为I’m Kevin\0,接着fputs()打印出来,并且没有换行。然后while进入下一轮迭代,fgets()继续读取,第二次读取到“ ,from Chi ",并存储为,from Chi\0,接着fputs()打印出来,并且没有换行。直到读取完所有字符为止。最后一次输入时,直接键入回车,所以跳出while循环,程序结束并打印Done!
3⃣️fgets()操作进阶:
如果说我们想第一次的输入 “I’m Kevin,from China.” 只读取前9个字符,然后丢弃掉其他的字符,第二次输入也是如此,那该怎么办???
换句话说该想法就是:按照设定的大小读取输入行,并删除储存在字符串中的换行符,如果没有换行符,则丢弃数组装不下的字符。
再拆分成小的问题则就是以下的两个问题:
- 那如果不希望把换行符储存在字符串中,如何处理掉换行符呢??
我们可以在已储存的字符串中查找换行符,并将其替换为空字符:
while(words[i] != 'n' ) {i++;}
words[i] = '\0\;
- 如果仍然有字符串留在输入行怎么办??
丢弃掉其余的字符串即可。
详细原理可以查看主页文章《C语言 getchar()原理及易错点解析》
while(getchar() != '\n')continue;
我们把这两个问题整合到上面的代码中:
#include <stdio.h>
#define LEN 10
int main(void){char words[LEN];puts("Enter Strings (empty line to quit): ");while(fgets(words, LEN, stdin) != NULL && words[0] != '\n'){int i=0;while(words[i] != '\n' && words[i] != '\0'){i++;}if(words[i] == '\n'){words[i] = '\0';}else{while(getchar() != '\n')continue;}puts(words);}puts("Done!");return 0;}
while(words[i] != '\n' && words[i] != '\0'){i++;}
这段代码说的是,遍历字符串,直至遇到换行符或者空字符。如果先遇到换行符,下面的if语句将其换成空字符;如何先遇到空字符,else就将输入行舍弃。
注意⚠️:空字符与空格不一样!!!!空字符是’ \0 ',ASCII码为0;空格的ASCII为32. 下面程序可以验证:
#include <stdio.h>
void main()
{char a=' ';char b='\0';printf ("%d\n",a);printf ("%d\n",b);}
Output:
32
0
C语言fgets()与fputs()详解相关推荐
- fgets()函数的详解-使用技巧-C语言基础
这篇文章要探讨的是"fgets()函数的详解以及使用时需要注意的一些细节".涉及fgets()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). fgets()(函数原型: ...
- fgets()函数的详解以及使用时需要注意的一些细节-C语言基础
这篇文章要探讨的是"fgets()函数的详解以及使用时需要注意的一些细节".涉及fgets()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). fgets()(函数原型: ...
- 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解
原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...
- 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解
C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...
- C语言解决约瑟夫问题详解的代码
C语言解决约瑟夫问题详解的代码 参考文章: (1)C语言解决约瑟夫问题详解的代码 (2)https://www.cnblogs.com/odsxe/p/10791049.html (3)https:/ ...
- c语言中快排函数,c语言快排函数详解
c语言快排函数详解 int cmp(const void *a, const void *b) 返回正数就是说 cmp 传入参数第一个要放在第二个后面, 负数就是传入参数第一个要放第二个前面, 如果是 ...
- c语言printf函数中的格式控制字符串,C++_C语言格式化输入输出函数详解,一:格式输出函数printf()
1 - phpStudy...
C语言格式化输入输出函数详解 一:格式输出函数printf() 1.调用形式一般为:printf("格式化控制字符串",输出表列): 2.格式化控制字符串用于指定输出格式,它有三种 ...
- C语言:JSON格式详解
C语言:JSON格式详解 C语言:cJSON库用法详解 C语言:使用cJSON库构造JSON C语言:使用cJSON库解析JSON字符串 JSON 简介 JSON全称 JavaScript Objec ...
- c语言 is函数,关于C语言回调函数的详解~
原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...
最新文章
- ubuntu rar文件乱码
- 艺术是什么?不懂很难泡到妞!
- iOS9 App Thinning(应用瘦身)功能介绍
- 趣学python3(48)--列出所有目录及子目录文件
- 卷积神经网络训练的三个概念(Epoch,Batch,Iteration)
- 恢复Win10照片查看器
- ZOJ 3879(大模拟)
- BASIC-12 十六进制转八进制
- Spring Android 1.0.0.M3 发布
- 【西安活动】 | 4月20日「拥抱开源,又见.NET:云时代 • 新契机」
- 利用计算机制作多媒体最后一步,福建省高中会考 多媒体技术应用 选择题专项练习十一(201206)(有答案)...
- PHP基础班初学感悟
- 【DevCloud · 敏捷智库】如何进行需求优先级管理?
- elk 概念整理 集群状态 - yellow
- Let’s Encrypt 推动了 HTTPS 的普及
- 基于html制作一个介绍自己家乡的网站,排版整洁,内容丰富,主题鲜明
- ubuntu 添加证书
- gps网络对时Linux,GPS 网络对时设置 详细版.doc
- 字节跳动否认完成支付牌照收购 或是基于央行批准的不确定性
- 面试笔记-1.计算机网络面试核心