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 ...
随机推荐
- 消息队列,IPC机制(进程间通信),生产者消费者模型,线程及相关
消息队列 创建 ''' Queue是模块multiprocessing中的一个类我们也可以这样导入from multiprocessing import Queue,创 建时queue = Queue ...
- 69. Sqrt(x) - LeetCode
Question 69. Sqrt(x) Solution 题目大意: 求一个数的平方根 思路: 二分查找 Python实现: def sqrt(x): l = 0 r = x + 1 while l ...
- MySQL闪回工具之binlog2sql
一.binlog2sql 1.1 安装binlog2sql git clone https://github.com/danfengcao/binlog2sql.git && cd b ...
- 151-模型-Power BI&Power Pivot模型DAX函数使用量分析
151-模型-Power BI&Power Pivot模型DAX函数使用量分析 1.背景 我们在 Power BI 或者 Power Pivot 项目中会写很多的 DAX 表达式.在最后项目交 ...
- 记一次IIS网站启动不了的问题排查
今天清理了下机器中的IIS网站,将很久不用的网站都删除. 因为需要删除的比较多,正在使用的很少,就将网站全部删除了,然后准备重新添加需要用的. 在添加了网站后,点击启动按钮,发现网站启动不了,因为网站 ...
- 儿童节,和 AI 一起通关 “超级马里奥兄弟”
摘要:六一儿童节,快来训练一款自己的游戏 AI,用代码让马里奥从大反派酷霸王的魔掌里救回桃花公主. 本文分享自华为云社区<儿童节,和 AI 一起通关 "超级马里奥兄弟"> ...
- pip国内源配置
Python 的一大优点就是丰富的类库,所以我们经常会用 pip 来安装各种库,所以对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安 ...
- Kubernetes Job Controller 原理和源码分析(二)
概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...
- CSS SandBox
引言 本篇文章主要介绍的是关于CSS Sandbox的一些事情,为什么要介绍这个呢?在我们日常的开发中,样式问题其实一直是一个比较耗时的事情,一方面我们根据 UI 稿不断的去调整,另一方面随着项目越来 ...
- 写个js获取2019博客之星投票活动的名次与投票数
获取投票数 // app.jsvar request = require('request');var cheerio = require('cheerio');request('http://m23 ...
