c语言 fgets gets,第五讲 gets()fgets()
昨天我们说到怎么输入一个'Hello world'然后让printf完整打印出来,但是失败了,今天我们来尝试另外两个函数,gets()和getchar(),还是老规矩,我们用一个实例来引入主题:
----------------------------------
#include
int main()
{
char name[20];
printf('请输入字符串:\n');
gets(name);
printf('%s.\n',name);
getchar();
return 0;
}
--------------------------------------
运行程序后,输入Hello World,看看输出的会是什么?
输出是不是正常了?看来gets()这个函数果然是能够满足我们要求的,那么这个原型是什么呢?我们不妨来看一下MSDN是怎么写的:
char *gets( char *buffer ); MSDN是这么声明的,从这个声明我们可以推断出gets()应该返回一个指向char的指针,再从我们上面的实例,我们不难推断出这个函数返回的指针和传递给他的是同一个指针,所以他的定义应该像是这样:
----------------------------------
char *gets( char *buffer )
{
……
return (buffer);
}
------------------------------------
大家可能还在怀疑上面的定义是否正确,好吧,我们来验证一下,我们将函数修改一下,声明一个char指针,然后用gets(name)的返回值初始化这个指针。
-------------------------------------
#include
int main()
{
char name[20];
char* ptr;
printf('请输入字符串:\n');
ptr = gets(name);
printf('name = %s.\n',name);
printf('ptr = %s.\n',ptr);
getchar();
return 0;
}
--------------------------------------
现在我们再来看看ptr到底等于什么:
结果和想象中的一样,看来我们上面的推断没错,传入的指针和返还的指针是同一个指针。知道gets()之后我们再来看看运行上面这个程序,这一次,我们不输入Hello World,我们多输出两个单词看看,这样吧,我们就输入:Hello World,C/C++ program ,现在来看看他的输出情况吧:
嗯,输出好像没问题,我们不妨在敲一下键盘看看:
啊?怎么回事?为什么会出现这种情况呢?我想大家应该想到了,引起该异常主要来源来数组越界,因为我们声明的是name[20],但是我们却输入的字符已经超过了20,虽然能够正常输出,但是却造成了数组越界,所以当程序结束回收内存的时候就抛出了这个异常。
说到底,造成该类异常的主要原因还是在于gets()这个函数的不安全,为了避免该类事情的发生,c语言引入了fgets()。
----------------------------------------
和gets()比起fgets()确实安全得多,但是在处理键盘输入时,fgets()却没有gets()方便,毕竟fgets()主要还是为文件读取而设定的,但是还是可以用来读取键盘输入,现在我们来看看fgets()的声明:
char *fgets( char *bufffer, int n,FILE *stream );
fgets()的第一个参数和gets()的参数一样,第二个参数n表示读取字符的最大数,至于第三个参数,是转为文件而设定,指明需要读取的文件,如果要读取键盘的输入,这个参数为:stdin,stdin在头文件stdio.h里声明,所以要使用stdin,只需包含stdio.h头文件即可。我们将上面的程序修改一下来看看:
-------------------------------------
#include
int main()
{
char name[20];
char* ptr;
printf('请输入字符串:\n');
ptr = fgets(name,20,stdin);
printf('ptr = %s,name = %s.\n',ptr,name);
return 0;
}
--------------------------------------
大家可以自己尝试运行一下,这一次可以完美运行了,所以建议大家在读取键盘输入的时候尽量使用fgets()。
--------------------------------------
和gets()相对应的是puts(),我们再将上面的例子修改一下,如下所示:
-------------------------------------
#include
int main()
{
char name[20];
char* ptr;
printf('请输入字符串:\n');
ptr = gets(name);
puts(name);
return 0;
}
--------------------------------------
这个程序的输出和我们刚才的实例完全一样:
------------------------------------------
现在想必大家已经猜到和fgets()对应的是fputs(),fputs()是puts()的文件版本,他的声明像这样:
int fputs( const char *buffer, FILE *stream );
fputs()需要第二参数,可以使用stdout(standard output)来作为输出参数 ,我们将上面的程序修改一下,如下:
-------------------------------------
#include
int main()
{
char name[20];
char* ptr;
printf('请输入字符串:\n');
ptr = fgets(name,20,stdin);
fputs(name,stdout);
return 0;
}
--------------------------------------
该程序的运行结果和上面的一样,但安全性却比上面的要高,大家可以自己尝试一下吧。
现在总结一下三个标准输入函数:
scanf():更基于获取单词(get word)而不是获取字符串,他在遇到第一个空格时结束读取。
gets():顾名思义,他就是get string,所以他会连续获取一连串的字符,包括标点符号和空格,但是会在遇到换行符'\n'时结束读取。
fgets():f当然表示file,所以他是gets()的文件版本。
三个标准输出函数:
printf():标准格式化输出,功能强大,效率不俗,仅次于puts()。
puts():效率最高的输出函数,但只能配合gets()使用,而且只能用于输出字符串。
fputs():puts()的文件版本。
--------------------------
还有一对输入和输出函数:getchar()和putchar(),由于今天太晚了,就先不说这两函数了,明天再给大家说说这两个函数,看名字我想大家可能已经猜到这两个函数是用于什么。
===================
回复D直接查看目录
c语言 fgets gets,第五讲 gets()fgets()相关推荐
- c语言gets长度溢出,gets和fgets 注意溢出的情况
fgets()函数的基本用法为: fgets(char * s,int size,FILE * stream); 注: 1.第一个参数为将被赋值的数组名.注意,不用写数组名称后面的方括号以及其中的数组 ...
- c语言函数fread的调用形式,C语言的问题,fread和fgets的区别是什么?
fgets函数用来从文件中读入字符串.fgets函数的调用形式如下:fgets(str,n,fp):此处,fp是文件指针:str是存放在字符串的起始地址:n是一个int类型变量.函数的功能是从fp所指 ...
- fgets阻塞 stdin 退出_linux fgets 阻塞
当前位置:我的异常网» 热门搜索 » linux fgets 阻塞 linux fgets 阻塞 www.myexceptions.net 网友分享于:2013-09-23 搜索量:159次 场 ...
- C语言入门笔记 第五讲【循环语句之while】
零.引言 我们已经掌握了,if语句. 当条件满足的情况下,if语句后的语句执行,否则不执行.但是这个语句只会执行一次. 但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次. 那我们怎么 ...
- 【C++ 语言】文件操作 ( fopen | fprintf | fscanf | fgets | fputc | fgetc | ofstream | ifstream )
文章目录 I C 函数 fopen 打开文件 II C 函数 fprintf 写出文件 III C 函数 fscanf 读取文件 ( 遇到空格换行结束) IV C 函数 fgets 读取文件 ( 遇到 ...
- C语言fgets()与fputs()详解
文章目录 fgets()与fputs() 1⃣️fgets()优缺点: 2⃣️fgets()返回值: 3⃣️fgets()操作实例: 3⃣️fgets()操作进阶: fgets()与fputs() f ...
- C语言文件操作之fgets()
来说一说fgets(..)函数. 原型 char * fgets(char * s, int n,FILE *stream); 参数: s: 字符型指针, ...
- c语言 fgets用法,fgets和fputs的用法详解
#include char *fgets(char *s, int size, FILE *stream); 功能:从文件流读取一行,送到缓冲区,使用时注意以下几点: 返回值:成功时s指向哪返回的指针 ...
- C/C++语言文件操作之fgets
来说一说fgets(..)函数. 原型 char * fgets(char * s, int n,FILE *stream); 参数: s: 字符型指针,指向存储 ...
最新文章
- (2017年11月)天池医疗AI大赛肺部结节智能诊断在线分享
- 达摩院2022年十大科技趋势发布:AI for Science刚开始,大模型进入冷静期
- 高速串行自同步方式介绍及原理
- Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)
- Office快捷键大全之三(Access快捷键下篇)
- 审查元素找不到创建的元素_香奈儿除了珍珠,还有哪些你不知道的经典元素?答案在原文中找...
- 事务的隔离级别 mysql
- 区块链的有趣应用:买彩票、云养鸡、查茅台
- 主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现
- 跟着 Microsoft 跑!
- 【转载】jQuery框架
- node.val java_LeetCode——21. 合并两个有序链表(Java)
- Cocos2dx ParticleEditor粒子编辑器
- 【20220627】【信号处理】自相关函数的定义、计算方法及应用
- 好看的php登录界面,php注册和登录界面的实现案例(推荐)
- 什么是JSX、是如何使用以及注意事项
- 2022年物理学诺奖获主,他们证明爱因斯坦错了
- adb devices offline_android adb devices offline的解决办法
- 【解决方案】【亲测有效】Windows10离线安装.net3.5
- Show一下拿的奖杯
热门文章
- python收集论文数据造假_论文数据造假被发现的可能有多大?
- 正则匹配中文姓名包括少数名字中间的·
- 三大基础排序算法——我欲修仙(功法篇)
- linux安装JDK1.8详细步骤
- 减速器箱体加工工艺及镗φ35孔夹具设计(说明书+8张CAD图纸爱+15张工序卡+过程卡)
- zblog php getlist,ZBlog开发教程:GetList 函数的详细用法
- Ocean/Ocean+: 实时目标跟踪分割算法《Object-aware Anchor-free Tracking》翻译
- SSH框架整合开发(SSH框架整合过程)
- 德玛西亚万岁-----状压dp
- 根据不同时间,页面显示不同图片,同时显示不同问候语