c语言中的gets和fgets的使用差别
gets和fgets的差别
2022年6月30日
#include<stdio.h>
#include<string.h>
#define STLEN 8
int main(int argc, char* argv[]){
char a[STLEN];
gets(a);
printf("%d\n",strlen(a));
printf("%d\n",a[7]);
printf("%c\n",a[7]);
return 0;
}
我们在读取字符串时,scanf()和转换说明%s只能读取一个单词,但是在程序中我们要读取一行字符串的时候需要用到别的函数,比如这里的gets()函数,获取一行的数据输入,直至遇到换行符,丢弃换行符,存储其余的字符并且会在末尾处追加一个空字符,使得其成为一个c语言的字符串。使用gets()函数会出现一些问题。比如我们这里的gets函数的参数是a,我们无法检查a数组是否装得下我们从键盘上输入的值,如果输入字符过长就会导致缓冲区溢出。
在这里输入字符串到7时则不会出现错误。第二行的7是通过键盘输入的字符有7个后面追加了一个'\0',所以我们第三行输出a[7]时,能输出0是因为'\0'的ASCII 的十进制数为0,且第四行通过%c输出的是空字符。使用该函数很容易出现溢出问题。
而fgets函数有三个参数我们通过第二个参数来限制读入字符的最大量。
#include<stdio.h>
#include<string.h>
#define STLEN 8
int main(int argc, char* argv[]){
char a[STLEN];
fgets(a ,STLEN ,stdin);
printf("%d\n",strlen(a));
printf("%d\n",a[7]);
printf("%c\n",a[7]);
return 0;
}
第三个参数是stdin(标准输入),该标识符定义在stdio.h中,但我们规定了第二个参数的大小,确保这里的不会出现缓冲区溢出。
值得注意的是fgets()函数与gets函数()不同的是前者会读取换行符
- gets()函数的使用容易造成缓存区溢出(buffer overflow),遇见换行符时丢弃换行符存储其他字符且在字符串后面跟上空字符。
- fgets()函数通过第二个参数,限制读入字符数解决溢出问题,读入n-1个字符,或者读到遇见一个换行符为止,且能存储换行符。
c语言中的gets和fgets的使用差别的更多相关文章
- C语言中file文件指针概念及其操作 (转载)
文件 文件的基本概念 所谓"文件"是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件. ...
- C语言中,头文件和源文件的关系(转)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
- C 语言中 setjmp 和 longjmp
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
- c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
- C语言中do...while(0)的妙用(转载)
转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...
- C语言中,定义的含义?声明的含义?它们之间的区别是什么?
在C语言中,对于定义和声明,也许我们非常的熟悉,但不一定真正的了解! 定义的含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名 ...
- C++中函数的默认参数和C语言中volatile的学习
1.函数默认参数 1 int func(int a,int b=10) 2 { 3 return a*b; 4 } 5 6 int main() 7 { 8 int c=func(2); 9 cout ...
- C语言中qsort函数用法
C语言中qsort函数用法-示例分析 本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...
- c语言中time相关函数
工作中遇到的函数: int seed = time(NULL); srand(seed); signal(SIGINT, stop); signal(SIGUSR1, sig_usr1); 搜time ...
随机推荐
- JDK自带线程池学习
JDK自带线程池 线程池的状态 线程有如下状态 RUNNING状态:Accept new tasks and process queued tasks SHUTDOWN状态:Don't accept ...
- git 1.2
1.git服务器的搭建 gitlab 常用命令: gitlab-rails console -e production 进入控制台指令 sudo gitlab-ctl start # 启动所有 gi ...
- 132_Power BI之建模必备要素&Power Query之数据表字段名称管理
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 近段时间比较忙,也没有看到很好的DAX素材,很久没有更新文章了,刚好有时间就来凑个热闹. 今天主题是Power ...
- Helloworld 驱动模块加载
介绍 本文引用<linux设备驱动开发>书中部分解释,记录开篇第一章helloworld程序 以下内容需要掌握如下基础信息linux模块概念.链接编译.c语言基础 内容 helloworl ...
- conda和pip加速参考
conda install和创建虚拟环境下载慢,可以修改/root/.condarc文件: vim /root/.condarc 各系统都可以通过修改用户目录下的 .condarc 文件.Window ...
- Git镜像
http://npm.taobao.org/mirrors/git-for-windows/v2.34.1.windows.1/ Git 阿里镜像,高速 下载
- spring源码解析:元注解功能的实现
前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...
- MAUI与Blazor共享一套UI,媲美Flutter,实现Windows、macOS、Android、iOS、Web通用UI
1. 前言 距离上次发<MAUI初体验:爽>一文已经过去2个月了,本计划是下半年或者明年再研究MAUI的,现在计划提前啦,因为我觉得MAUI Blazor挺有意思的:在Android.iO ...
- 简述电动汽车的发展前景及3D个性化定制需求
李彦宏前几天又搞事,他宣布百度要开始造电动汽车了!百度市值更是因此一夜暴涨了700亿. 这熟悉的配方,好像在乔布斯.库克那里也见过. 苹果的"iCar"(或者是Apple Car) ...
- BUUCTF-爱因斯坦
爱因斯坦 16进制打开可以看到存在压缩包,使用binwalk分离出来 提示需要解压密码,按照常理爆破四位数纯数字没有出来,查看图片属性发现密码 得到flag