【C语法学习】7 - fgets()函数

news2025/7/25 21:28:28

文章目录

  • 1 函数原型
  • 2 参数
  • 3 返回值
  • 4 读取机制
  • 5 比较
  • 6 示例
    • 6.1 示例1
    • 6.2 示例2
    • 6.3 示例3

1 函数原型

fgets():从指定流stream读取一个字符串存储到str指向的内存空间,函数原型如下:

char *fgets( char *str, int n, FILE *stream );

2 参数

fgets()函数有三个参数str、n和stream:

  1. str是一个指向char类型的指针,即str可以是一个字符指针变量名,也可以是一个字符数组名;
  2. n是读取的最大字符数(包括最后的空字符’\0’),类型为int型;把n设置为str指向内存空间的字节数,可防止内存访问越界;
  3. 参数stream是一个指向FILE类型结构的指针;stream指定了fgets()函数要读取的流,可以是文件流,也可以是标准输入流;当是文件流时,stream等于fopen()函数的返回值;当是标准输入流时,stream等于stdin。

3 返回值

fgets()函数的返回值类型是一个指向char类型的指针:

  1. 读取成功,返回str;
  2. 读取失败,返回NULL。

C语言标准描述如下:

1. Each of these functions returns its argument if successful. 
2. A NULL pointer indicates an error or end-of-file condition. 

4 读取机制

fgets()函数从指定流stream中读取字符,直至:

  1. 遇到换行符’\n’;
  2. 遇到文件结束符EOF;
  3. 读取n-1个字符。

以上三种情况任意一个满足,fgets()函数停止读取字符,并在已读取字符末尾添加空字符’\0’,形成完整的字符串(空字符’\0’是字符串结束标志或称为字符串结束符)。

5 比较

fgets()函数和gets()函数的工作原理类似,差异如下:

  1. fgets()函数从指定流stream中读取一行字符;
  2. gets()函数从标准输入流stdin中读取一行字符;
  3. 相比gets()函数,fgets()函数遇到换行符’\n’时,会保留换行符’\n’,并在其后添加空字符’\0’;
  4. 相比gets()函数,fgets()函数指定读取的最大字符数n,可防止内存访问越界;
  5. 可将fgets()函数的参数stream指定为stdin,则fgetc()函数的功能和getchar()函数的功能基本相同(差异见第3点对于换行符’\n’的处理上)。

6 示例

6.1 示例1

比较gets()函数和fgets()函数对换行符’\n’的处理,示例代码如下所示:

int main()
{
   char str1[20] = { 0 };
   char str2[20] = { 0 };

   int  len1 = 0;
   int  len2 = 0;   
   //
   printf("请输入字符串 :\n");
   gets(str1);
   puts(str1);
   printf("Length of str1 = %d\n", strlen(str1));
   //
   printf("\n");
   //
   printf("请输入字符串 :\n");
   fgets(str2, 20, stdin);
   puts(str2);
   printf("Length of str2 = %d\n", strlen(str2));
   //
   printf("\n");

   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

代码及运行结果分析:

  1. 字符数组str1各元素内容如下图所示。
    在这里插入图片描述
  2. 字符数组str2各元素内容如下图所示.
    在这里插入图片描述

6.2 示例2

fgets()函数读文件,文件中行长度小于n,示例代码如下所示:

int main()
{
   char str[20] = { 0 };

   FILE* fp;
   //打开文件
   if ((fp = fopen("1.txt", "r")) == NULL)
   {
      printf("Failed to open file\n");
      exit(1);
   }
   //读第一行
   fgets(str, 20, fp);
   printf("%s", str);
   //读第二行
   fgets(str, 20, fp);
   printf("%s\n", str);
   //关闭文件
   fclose(fp);

   return 0;
}

文件内容如下图所示:
在这里插入图片描述

代码运行结果如下图所示:

在这里插入图片描述

代码及运行结果分析:

  1. 第一次调用fgets()函数,遇到换行符’\n’结束,使用printf()函数打印时无需换行;
  2. 第二低调用fgets()函数,遇到文件结束符EOF结束,使用printf()函数打印时需加换行。

6.3 示例3

fgets()函数读文件,文件中行长度大于n,示例代码如下所示:

int main()
{
   char str[20] = { 0 };
   int len = 0;
   FILE* fp;
   //打开文件
   if ((fp = fopen("2.txt", "r")) == NULL)
   {
      printf("Failed to open file\n");
      exit(1);
   }
   //读第一行
   fgets(str, 10, fp);
   puts(str);
   printf("Length of str = %d\n\n", strlen(str));
   //读第二行
   fgets(str, 10, fp);
   puts(str);
   printf("Length of str = %d\n\n", strlen(str));
   //读第三行
   fgets(str, 10, fp);
   puts(str);
   printf("Length of str = %d\n\n", strlen(str));
   //关闭文件
   fclose(fp);

   return 0;
}

文件内容如下图所示:

在这里插入图片描述

代码运行结果如下图所示:

在这里插入图片描述

代码及运行结果分析:

  1. 第一次调用fgets()函数,文件行长度(26)大于n(10),读取9个字符"ABCDEFGHI"+空字符’\0’共10个字符写入字符数组str中,使用puts()函数打印时自动换行;
  2. 第二次调用fgets()函数,文件行长度(17)大于n(10),读取9个字符"JKLMNOPQR"+空字符’\0’共10个字符写入字符数组str中,使用puts()函数打印时自动换行;
  3. 第三次调用fgets()函数,文件行长度(8)小于n(10),遇到文件结束符EOF结束,读取8个字符"STUVWXYZ"+空字符’\0’共9个字符写入字符数组str中,使用puts()函数打印时自动换行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1156894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一篇文章认识【性能测试】

一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始,到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点再可以细分,如对于一个 C/S 软件的响应时间可以细分为网络传输时间、应用服务器处理时间、数据库服务器…

一文带你了解自动化测试是什么?

本章主要讲解自动化测试的含义、分类、项目使用,以及自动化测试工具的优势。 一、自动化测试概述 1、什么是自动化测试? 自动化测试是软件测试活动中的一个重要分支和组成部分。随着软件产业的不断发展,市场对软件周期的要求越来越高&…

Android页面周期、页面跳转

1.什么是Activity? Activity是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互。Activity用于显示用户界面,用户通过Activity交互完成相关操作,一个APP允许有多个Activity。 2.Activi…

CRM客户管理系统助力企业全流程精细化运营

效率是每一家企业都十分关注的重点。要想提高工作效率就要鄙弃粗放的管理模式,采用CRM客户管理系统赋能企业全流程精细化运营,让销售环节高速运转起来。 全流程精细化运营从哪些方面出发? 每一家企业的内部流程都不尽相同,客户管…

mfc140u.dll丢失怎么修复,mfc140u.dll文件有什么作用

今天我想和大家分享的是关于mfc140u.dll文件丢失的解决方法。在我们使用电脑的过程中,有时候会遇到一些错误提示,其中比较常见的就是“无法找到mfc140u.dll文件”。那么,这个文件是什么呢?它有什么作用呢? 首先&#…

双轮差速模型机器人通过线速度、角速度计算机器人位姿

已知上一时刻机器人位置P_OLD (x,y,),机器人当前时刻的线速度和角速度(v,),短时间内t内,机器人在线性部分和非线性部分的增量为 线性部分: 非线性部分: 由于可能非常小,导致非线性部分数值不稳定&#xf…

关于preempt count的疑问

Linux中的preempt_count - 知乎 https://www.cnblogs.com/hellokitty2/p/15652312.html LWN:关于preempt_count()的四个小讨论!-CSDN博客 主要是参考这些文章 之前一直认为只要是in_interrupt()返回非0值,那么就可以认为当前在中断上下文。即…

Spring Cloud Alibaba 之 Sentinel

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…

小黑子—spring:第四章 事务控制与整合web环境

spring入门4.0 四 小黑子基于AOP的声明式事务控制1. Spring事务编程概述2. 搭建测试环境3. 基于XML声明式事务控制3.1 入门操作3.2 声明式事务控制详解 4. 基于注解的声明式事务控制 五 小黑子用spring进行web环境整合5. JavaWeb三大组件作用及其特点6. Spring整合web环境的思路…

Java作业一

编写程序实现如下界面效果: import java.util.Scanner;public class Test01 {public static void main(String[] args) {String name;Scanner input new Scanner(System.in);System.out.println("请输入您的姓名:");name input.nextLine();S…

算法学习打卡day39|动态规划:62.不同路径 、 63. 不同路径 II

62.不同路径 力扣题目链接 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。…

Python图像处理【15】基于非锐化掩码锐化图像

基于非锐化掩码锐化图像 0. 前言1. 使用 scikit-image filters 模块执行非锐化掩码2. 使用 PIL ImageFilter 模块执行非锐化掩码3. 使用 SimpleITK 执行拉普拉斯锐化4. 使用 OpenCV 实现非锐化掩码小结系列链接 0. 前言 非锐化滤波器是一个简单的锐化算子,通过从原…

ArcGIS制作土地利用现状图

一、现状图成果 土地利用现状图是规划制图中一种基本的图件,基于ArcGIS制作的现状图如下所示: 二、现状图制作 1. 数据准备 (1)土地利用数据 (2)地形图 (3)影像地图 (4)其他数据 2. 符号化 加载现状地块数据。 双击地块图层,切换到符号系统,选择类别下的唯…

kubernetes-控制器

目录 一、replicaset 二、deployment 1、版本迭代 2、回滚 3、滚动更新策略 4、暂停与恢复 三、daemonset 四、statefulset 五、job 六、cronjob 一、replicaset ReplicaSet用于保证指定数量的 Pod 副本一直运行 vim rs-example.ymlapiVersion: apps/v1 kind: Replic…

Chat2DB Web版 服务器端安装部署启动流程

目录 前言安装部署过程下载安装包下载JDK17启动登录 可能出现的报错启动报错Java版本低flyway的bean创建失败登录失败无法执行二进制文件 前言 Chat2DB是款数据库连接工具,主要就是使用JDBC做数据库连接,外加多对接了几个聊天AI网站,把数据库…

敏捷开发框架Scrum-概述

如果你是一个程序员,可能会觉得这是个程序开发框架。我开始也是这样认为的。后来学习了PMP、敏捷后,才知道Scrum是一个用于管理团队工作的敏捷框架。Scrum可以理解成一个团队在一段时间里完成工作的方式。这里的一段时间通常很短,一到两周&am…

【好书推荐】ChatGPT 驱动软件开发:AI 在软件研发全流程中的革新与实践

前言 计算机技术的发展和互联网的普及,使信息处理和传输变得更加高效,极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术,也在不断地影响和改变着各个行业。 如今,我们正在见证人工智能…

vue 中methods方法为啥不能用箭头函数

vue用了很久了,但是又返回来看这个神秘的问题 这里理解不了:问题一:为啥他的上层就是script了呀,箭头函数没有作用域? 问题二:箭头函数没有作用域,但是外层的methods,{} 花括号不是…

518抽奖软件,可从Excel~Word~Pdf~网页导入名单

518抽奖软件简介 518抽奖软件,518我要发,超好用的年会抽奖软件,简约设计风格。 包含文字号码抽奖、照片抽奖两种模式,支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 从Excel、WPS表格导入 整列: 用鼠…

Linux C语言进阶-D1二维数组

数据类型 数组名[常量表达式][常量表达式] 定义方式:声明时列数不能省略,行数可以 由于内存是一维的,所以数组时顺序存放的:按行顺序排放 行名a[0]、a[1]、a[2]可以称为一维数组名 验证行名就是一维数组名: 1、数组名…