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

article/2025/10/9 17:28:22

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

fgets()(函数原型:char *fgets(char *restrict str, int size, FILE *restrict stream))

这个函数原型不太好看出个所以然来,可以理解为(char *fgets(“容器的地址”, “容器的大小”, “从哪里读取”))


一般用法:

char a[100] = {0};
fgets(a, 100, stdin);

通俗来讲的话,fgets()函数的作用就是用来读取一行数据的。但要详细且专业的说的话,fgets()函数的作用可以这么解释:从第三个参数指定的流中读取最多第二个参数大小的字符到第一个参数指定的容器地址中。在这个过程中,在还没读取够第二个参数指定大小的字符前,读取到换行符'\n'或者需要读取的流中已经没有数据了。则提前结束,并把已经读取到的字符存储进第一个参数指定的容器地址中。

在正常情况下fgets()函数的返回值和它第一个参数相同。即读取到数据后存储的容器地址。但是如果读取出错或读取文件时文件为空,则返回一个空指针。


fgets()函数的运行流程大概是这样子的:

当系统调用这个函数的时,系统便会阻塞等待用户的输入,直到用户输入回车符’\n’才返回程序。然后用户输入的内容会被系统放进输入缓存区里面,fgets()函数便会进来读取其“第二个参数减1(为什么减1后面说)”个字节存进它第一个参数指向的内存地址中,如果在还没读取够需要的字节大小前读取到换行符’\n’则提前返回。


fgets()函数的注意事项1

fgets()函数的最大读取大小是其“第二个参数减1”,这是由于字符串是以’\0’为结束符的,fgets()为了保证输入内容的字符串格式,当输入的数据大小超过了第二个参数指定的大小的时候,fgets()会仅仅读取前面的“第二个参数减1”个字符,而预留1个字符的空间来存储字符串结束符’\0’

测试代码

#include <stdio.h>
int main(void)
{
    char a[10] = {0};
    printf("你的输入:");
    fgets(a, 4, stdin);
    //printf("%s\n", a);//下面这句的输出和这句是一样的
    printf("printf(\"%%s\\n\", a)%c==>%s\n", ';', a);
    return 0;
}

运行效果:

在这里插入图片描述

在这个例子中,fgets()的第二个参数是4,所以它最多只能存储输入的(4-1 = 3)个字符进第一个参数指向的地址空间里面。输入“abcde”,数组a[]中只有“abc”。


fgets()函数的注意事项2

fgets()函数的眼里,换行符’\n’也是它要读取的一个普通字符而已。在读取键盘输入的时候会把最后输入的回车符也存进数组里面,即会把’\n’也存进数组里面,而又由于字符串本身会是以’\0’结尾的。所以在输入字符个数没有超过第二个参数指定大小之前,你输入n个字符按下回车输入,fgets()存储进第一个参数指定内存地址的是n+2个字节。最后面会多出一个’\n’和一个’\0’,而且’\n’是在’\0’的前面一个(\n\0)。

测试代码:

#include <stdio.h>
int main(void)
{
    char a[10] = {0};
    printf("你的输入:");
    fgets(a, 10, stdin);
    //printf("%s\n", a);//下面这句的输出和这句是一样的
    printf("printf(\"%%s\\n\", a)%c==>%s\n", ';', a);
    for(int i=0; i<10; i++)
    {
        if(a[i] == '\n')
            printf("a[%d]是换行符'\\n'\n", i);
        if(a[i] == '\0')
            printf("a[%d]是字符串结束符'\\0'\n", i);
    }
    return 0;
}

运行效果:

在这里插入图片描述
在这个例子中,由于输入的字符小于参数2指定的最大读取字符数,所以fgets()函数会把换行符’\n’也储存进数组a[]里面,在运行界面的第三行哪里换了两次行,就是由于这个多出来的换行符’\n’和我输出代码中的换行符’\n’共同作用的结果。


fgets()函数的注意事项3

fgets()函数只负责读取,并不会事先清空参数1指向的地址内存。读取到的字节会覆盖原地址储存,但没有覆盖到的内容还是保持原样。

测试代码:

#include <stdio.h>
int main(void)
{
    char a[10] = {'1','1','1','1','1','1','1','1','1','1'};
    printf("你的输入:");
    fgets(a, 10, stdin);
    //printf("%s\n", a);//下面这句的输出和这句是一样的
    printf("printf(\"%%s\\n\", a)%c==>%s\n", ';', a);
    for(int i=0; i<10; i++)
    {
        if(a[i] == '\n' || a[i] == '\0')
            printf("a[%d] = '\\%c'", i, a[i]=='\n'?'n':'0');
        else
            printf("a[%d] = %c", i, a[i]);
        printf("\n");
    }
    return 0;
}
 

运行结果:

在这里插入图片描述


fgets()函数的注意事项4

在用fgets()函数读取键盘输入的时候,如果输入多于其“第二个参数减1”个字符大小的数据,fgets()只会读取走前”第二个参数减1”个字符,多余的字符残留在输入缓存区里面。如果不清空,可能会影响下次输入。

测试代码:

#include <stdio.h>
int main(void)
{
    char a[4] = {0};
    char b[10] = {0};
    printf("存进a的输入:");
    fgets(a, 4, stdin);
    for(int i=0; i<4; i++)
        printf("a[%d] = %c\n", i, a[i]);
    printf("存进b的输入:");
    fgets(b, 10, stdin);
    printf("这里没有阻塞等待输入,而是直接跳过了\n");
    //printf("%s", a);//下面这句的输出和这句是一样的
    printf("printf(\"%%s\", b)%c==>%s", ';', b);
    return 0;
}
 

运行结果:

在这里插入图片描述

在这个例子中,输入“abcde”之后,数组a[]读取走“abc”之后,代码运行到第11行的时候并没有停下来等待用户的输入,而是直接读取了还留在缓存区里面的“de\n”,读取到‘\n’之后返回,所以我最后一行的输出代码中并没有加上换行符’\n’,因为数组b[]中已经包含有换行符’\n’了。


fgets()函数的注意事项5

遇到再更新。。。


零BUG是原则性问题。


http://chatgpt.dhexx.cn/article/bAuEji4T.shtml

相关文章

男女声语音转换

男女声特点 &#xff08;此部分转载自https://blog.csdn.net/u011389706/article/details/78965233&#xff09; 男女声基本区别 男女声主要区别在于男女声基音频率&#xff08;pitch frequency&#xff09;的高低。一般女声的音调比男声的音调高&#xff0c;这种不同主要是反…

最新游戏陪玩语音聊天系统源码+视频搭建教程

一个人的游戏叫孤独&#xff0c;一群人的游戏才是乐趣&#xff0c;随着电竞产业在国内的快速发展&#xff0c;游戏陪练行业也迅速成长&#xff0c;现在很多游戏玩家为了追求更高质量的游戏体验感&#xff0c;往往会在玩游戏的过程中找陪练&#xff0c;通过陪玩系统进行预约游戏…

伪造微信语音文件的过程分析

说实话&#xff0c;写这篇《续》&#xff0c;小编是很纠结的。我们绝不是要传授犯罪方法&#xff0c;而是要告诉大家&#xff0c;伪造微信语音聊天记录的行为是如何进行的。&#xff08;安卓实测&#xff0c;苹果略有不同&#xff09; 一、微信语音文件的存储 关于这一点&…

微信PC端技术研究(2)-保存聊天语音

微信PC端技术研究-保存聊天语音 转载地址&#xff1a;[原创]微信PC端技术研究(2)-保存聊天语音-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com 0x0. 前言 最近又学习了某位大佬用CE的方法&#xff0c;大佬的一句话有点醍醐灌顶&#xff0c;然后有了新的感觉&#xff0…

将微信语音消息转换为 mp3

获取语音文件&#xff08;.silk&#xff09; 需要在电脑上实现。首先&#xff0c;查看你的微信 Mac 版本将数据存放在哪个目录下&#xff0c;我的是在这个目录下&#xff1a; /Users/henry/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.te…

WX Backup - 免费微信聊天记录备份导出与查看工具 (可提取图片/视频/语音)

微信绝对是一个让人爱恨交织的 APP&#xff0c;它在国内几乎完全占据了人们的社交以及生活的方方面面&#xff0c;但腾讯却并没有为微信提供好用的「聊天记录」备份导出和查看的功能。 WX Backup 是一款完全免费的微信聊天记录备份导出工具&#xff0c;支持 Windows 和 Mac&…

微信语音文件转换mp3

1、先找到手机里面的音频文件&#xff08;.amr&#xff09; 2、下载软件silk2mp3 ①双击silk2mp3.exe ②选择文件 ③开始转换 3、本来以为电脑客户端中也能找到相应的文件&#xff0c;但是发现是加密过的&#xff0c;不能用&#xff1b;所以只能使用android手机找到对应文件…

怎么导出微信语音【亲测有效】

在手机上长按你想导出的语音&#xff0c;点收藏 来到我的-收藏&#xff0c;打开刚才收藏语音&#xff0c;右上角三个点点&#xff0c;点转存为笔记 ok放下手机 来到pc端微信 - 收藏&#xff0c;找到刚才的笔记 进去&#xff0c;选中 - 右键 - 复制 发给你的文件传输助手 找到…

微信语音转换成mp3文件保存的简单详细步骤

目录 读者手册 一、前言 二、操作步骤一 把语音转化为silk文件&#xff08;silk后缀的文件&#xff09; 1.长按语音收藏&#xff08;手机操作&#xff09; 2.找到主页收藏 3.找到收藏的语音 4.转存为笔记 5.点击笔记里面的语音&#xff08;下面全部电脑操作&#xff0…

如何导出你的微信语音

苏生不惑第145 篇原创文章&#xff0c;将本公众号设为星标&#xff0c;第一时间看最新文章。 关于微信之前写过以下文章&#xff0c;有兴趣可以点击查看&#xff1a; 那些你可能不知道的微信奇技淫巧 那些你可能不知道的网络冷知识奇技淫巧 一个骚操作&#xff0c;公众号粉丝破…

简单3步:微信语音转成mp3

ACM亚洲区域赛获奖者 北漂女程序员 喜欢就关注我吧&#xff01; 在家人眼里&#xff0c;我学的专业就是打杂的。 前天我的嫂子问我怎么把微信聊天语音转换成mp3格式保存分享。 咔咔咔&#xff0c;教程来了。 1&#xff0c;把微信语音信息保存下来 2&#xff0c;找到微信语音信息…

在电脑上微信无法语音聊天,微信听不到语音声音

联想笔记本Windows11微信3.7.6.44 新更新的window系统&#xff0c;有线耳机在其他网页和应用上播放语音都是正常的&#xff0c;耳机肯定没坏&#xff0c;唯独在微信上无法播放语音和语音电话。 解决办法&#xff1a; 1、右击开始菜单&#xff0c;&#xff08;就是Windows开机…

一秒语音是什么软件,微信一秒语音包软件

微信一秒语音包软件是一款专为使用微信聊天的伙伴设计的&#xff0c;汇集了海量聊天语音包素材&#xff0c;并且可以实时更新语音包素材&#xff0c;所以的语音素材内容实时上线热门语音包&#xff0c;操作方法简单&#xff0c;拥有男声、女声等语音&#xff0c;还可以在这里制…

PHP代码审计二(通用代码审计思路)

总结一下在PHP代码审计中常用到的代码审计思路 文章目录 敏感函数逆向回溯参数过程espcms注入挖掘案例 通读全文代码根据功能点定向审计BugFree重装漏洞案例 敏感函数逆向回溯参数过程 根据敏感函数来逆向追踪参数的传递过程&#xff0c;是目前使用的最多的一种方式&#xff…

php代码审计实战(一)

前言:这套漏洞好水,为什么审他呢&#xff1f;原因是虽然一直挖漏洞 也用白盒摸出过不少洞,但是还没有彻彻底底的通审过一套系统 所以就找了套简单的摸摸鱼 源码:熊海CMS_1.0 安装方法:这里是用宝塔直接搭建的 ①数据库 需要宝塔建立一个数据库导入那个数据库文件就好了 然后…

PHP代码审计环境配置教程

PHP代审环境配置 1.vscode的配置2.PHPstudy配置3.使用xdebug调试代码 1.vscode的配置 安装插件 code runner PHP debug 2.PHPstudy配置 软件管理 — PHP设置 — 开启XDebug调试组件 开启XDebug调试组件之后&#xff0c;可以看到php.ini文件底部多了如下几行&#xff1a; [X…

PHP代码审计系列(一)

PHP代码审计系列&#xff08;一&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 extract变量覆盖 源码如下 <?php$flagextractFlag.txt; extract($_GET);if(isset($shiyan)){ $contenttrim(f…

php代码审计学习-baijiacms v4

php代码审计学习&#xff08;baijiacms v4代码审计-system任意命令执行&#xff09; 文章目录 前言一、危险函数查找二、访问测试三、 构造 payload&#xff0c;触发漏洞总结 前言 最近及将来一段时间都会利用空闲的时间学习PHP代码审计 记录代码审计学习过程&#xff0c;最近…

PHP代码审计之基础篇

最近在学PHP代码审计&#xff0c;那就将学习的笔记都整理一遍吧~ 前期准备&#xff1a; 当然&#xff0c;最基本的前提是至少大致学过PHP的语法。 1、安装相关软件&#xff0c;如Sublime text、 Notepad、editplus、 Seay源代码审计系统等 2、获得源码&#xff0c;可以到网上…