昨天我们说到怎么输入一个'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()相关推荐

  1. c语言gets长度溢出,gets和fgets 注意溢出的情况

    fgets()函数的基本用法为: fgets(char * s,int size,FILE * stream); 注: 1.第一个参数为将被赋值的数组名.注意,不用写数组名称后面的方括号以及其中的数组 ...

  2. c语言函数fread的调用形式,C语言的问题,fread和fgets的区别是什么?

    fgets函数用来从文件中读入字符串.fgets函数的调用形式如下:fgets(str,n,fp):此处,fp是文件指针:str是存放在字符串的起始地址:n是一个int类型变量.函数的功能是从fp所指 ...

  3. fgets阻塞 stdin 退出_linux fgets 阻塞

    当前位置:我的异常网» 热门搜索 » linux fgets 阻塞 linux fgets 阻塞 www.myexceptions.net  网友分享于:2013-09-23   搜索量:159次 场 ...

  4. C语言入门笔记 第五讲【循环语句之while】

    零.引言 我们已经掌握了,if语句. 当条件满足的情况下,if语句后的语句执行,否则不执行.但是这个语句只会执行一次. 但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次. 那我们怎么 ...

  5. 【C++ 语言】文件操作 ( fopen | fprintf | fscanf | fgets | fputc | fgetc | ofstream | ifstream )

    文章目录 I C 函数 fopen 打开文件 II C 函数 fprintf 写出文件 III C 函数 fscanf 读取文件 ( 遇到空格换行结束) IV C 函数 fgets 读取文件 ( 遇到 ...

  6. C语言fgets()与fputs()详解

    文章目录 fgets()与fputs() 1⃣️fgets()优缺点: 2⃣️fgets()返回值: 3⃣️fgets()操作实例: 3⃣️fgets()操作进阶: fgets()与fputs() f ...

  7. C语言文件操作之fgets()

        来说一说fgets(..)函数.     原型  char *  fgets(char * s, int n,FILE *stream);     参数:          s: 字符型指针, ...

  8. c语言 fgets用法,fgets和fputs的用法详解

    #include char *fgets(char *s, int size, FILE *stream); 功能:从文件流读取一行,送到缓冲区,使用时注意以下几点: 返回值:成功时s指向哪返回的指针 ...

  9. C/C++语言文件操作之fgets

    来说一说fgets(..)函数.     原型  char *  fgets(char * s, int n,FILE *stream);     参数:          s: 字符型指针,指向存储 ...

最新文章

  1. (2017年11月)天池医疗AI大赛肺部结节智能诊断在线分享
  2. 达摩院2022年十大科技趋势发布:AI for Science刚开始,大模型进入冷静期
  3. 高速串行自同步方式介绍及原理
  4. Spark-SQL从MySQL中加载数据以及将数据写入到mysql中(Spark Shell方式,Spark SQL程序)
  5. Office快捷键大全之三(Access快捷键下篇)
  6. 审查元素找不到创建的元素_香奈儿除了珍珠,还有哪些你不知道的经典元素?答案在原文中找...
  7. 事务的隔离级别 mysql
  8. 区块链的有趣应用:买彩票、云养鸡、查茅台
  9. 主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现
  10. 跟着 Microsoft 跑!
  11. 【转载】jQuery框架
  12. node.val java_LeetCode——21. 合并两个有序链表(Java)
  13. Cocos2dx ParticleEditor粒子编辑器
  14. 【20220627】【信号处理】自相关函数的定义、计算方法及应用
  15. 好看的php登录界面,php注册和登录界面的实现案例(推荐)
  16. 什么是JSX、是如何使用以及注意事项
  17. 2022年物理学诺奖获主,他们证明爱因斯坦错了
  18. adb devices offline_android adb devices offline的解决办法
  19. 【解决方案】【亲测有效】Windows10离线安装.net3.5
  20. Show一下拿的奖杯

热门文章

  1. python收集论文数据造假_论文数据造假被发现的可能有多大?
  2. 正则匹配中文姓名包括少数名字中间的·
  3. 三大基础排序算法——我欲修仙(功法篇)
  4. linux安装JDK1.8详细步骤
  5. 减速器箱体加工工艺及镗φ35孔夹具设计(说明书+8张CAD图纸爱+15张工序卡+过程卡)
  6. zblog php getlist,ZBlog开发教程:GetList 函数的详细用法
  7. Ocean/Ocean+: 实时目标跟踪分割算法《Object-aware Anchor-free Tracking》翻译
  8. SSH框架整合开发(SSH框架整合过程)
  9. 德玛西亚万岁-----状压dp
  10. 根据不同时间,页面显示不同图片,同时显示不同问候语