文章目录

  • 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()储存换行符有好有坏

  1. 缺点是你可能并不想把换行符储存在字符串中,这样的换行符会带来一些麻烦。
  2. 优点是对于储存的字符串而言,检查末尾是否有换行符可以判读是否读取了一整行。如果不是一整行,要处理好一行中剩下的字符。

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个字符,然后丢弃掉其他的字符,第二次输入也是如此,那该怎么办???
换句话说该想法就是:按照设定的大小读取输入行,并删除储存在字符串中的换行符,如果没有换行符,则丢弃数组装不下的字符。
再拆分成小的问题则就是以下的两个问题:

  1. 那如果不希望把换行符储存在字符串中,如何处理掉换行符呢??
    我们可以在已储存的字符串中查找换行符,并将其替换为空字符:
while(words[i] != 'n' ) {i++;}
words[i] = '\0\;
  1. 如果仍然有字符串留在输入行怎么办??
    丢弃掉其余的字符串即可。
    详细原理可以查看主页文章《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()详解相关推荐

  1. fgets()函数的详解-使用技巧-C语言基础

    这篇文章要探讨的是"fgets()函数的详解以及使用时需要注意的一些细节".涉及fgets()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). fgets()(函数原型: ...

  2. fgets()函数的详解以及使用时需要注意的一些细节-C语言基础

    这篇文章要探讨的是"fgets()函数的详解以及使用时需要注意的一些细节".涉及fgets()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). fgets()(函数原型: ...

  3. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  4. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

  5. C语言解决约瑟夫问题详解的代码

    C语言解决约瑟夫问题详解的代码 参考文章: (1)C语言解决约瑟夫问题详解的代码 (2)https://www.cnblogs.com/odsxe/p/10791049.html (3)https:/ ...

  6. c语言中快排函数,c语言快排函数详解

    c语言快排函数详解 int cmp(const void *a, const void *b) 返回正数就是说 cmp 传入参数第一个要放在第二个后面, 负数就是传入参数第一个要放第二个前面, 如果是 ...

  7. c语言printf函数中的格式控制字符串,C++_C语言格式化输入输出函数详解,一:格式输出函数printf() 1 - phpStudy...

    C语言格式化输入输出函数详解 一:格式输出函数printf() 1.调用形式一般为:printf("格式化控制字符串",输出表列): 2.格式化控制字符串用于指定输出格式,它有三种 ...

  8. C语言:JSON格式详解

    C语言:JSON格式详解 C语言:cJSON库用法详解 C语言:使用cJSON库构造JSON C语言:使用cJSON库解析JSON字符串 JSON 简介 JSON全称 JavaScript Objec ...

  9. c语言 is函数,关于C语言回调函数的详解~

    原标题:关于C语言回调函数的详解~ 01 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下, ...

最新文章

  1. ubuntu rar文件乱码
  2. 艺术是什么?不懂很难泡到妞!
  3. iOS9 App Thinning(应用瘦身)功能介绍
  4. 趣学python3(48)--列出所有目录及子目录文件
  5. 卷积神经网络训练的三个概念(Epoch,Batch,Iteration)
  6. 恢复Win10照片查看器
  7. ZOJ 3879(大模拟)
  8. BASIC-12 十六进制转八进制
  9. Spring Android 1.0.0.M3 发布
  10. 【西安活动】 | 4月20日「拥抱开源,又见.NET:云时代 • 新契机」
  11. 利用计算机制作多媒体最后一步,福建省高中会考 多媒体技术应用 选择题专项练习十一(201206)(有答案)...
  12. PHP基础班初学感悟
  13. 【DevCloud · 敏捷智库】如何进行需求优先级管理?
  14. elk 概念整理 集群状态 - yellow
  15. Let’s Encrypt 推动了 HTTPS 的普及
  16. 基于html制作一个介绍自己家乡的网站,排版整洁,内容丰富,主题鲜明
  17. ubuntu 添加证书
  18. gps网络对时Linux,GPS 网络对时设置 详细版.doc
  19. 字节跳动否认完成支付牌照收购 或是基于央行批准的不确定性
  20. 面试笔记-1.计算机网络面试核心

热门文章

  1. 提高计算机语言理论能力水平--阅读提炼
  2. 中文版Chrome浏览器不支持12px以下字体的解决方案
  3. java中如何高效遍历Map集合
  4. 关于模块化立即执行函数和ESModule的详解
  5. html滚动抽奖主题,html+css抽奖大转盘
  6. TensorFlow构建模型(TFRecord)十
  7. ACID和BASE之间的一致性、可用性和分区宽容度(CAP)
  8. 亲测有效的下载微信公众号推文视频的一种方法。
  9. 工程师从北京润到芝加哥
  10. 小学计算机室板报花边,手抄报花边:如何定好报名