前言

大家都知道在C语言中,有三种主要的输入函数:scanf(),fgets()以及gets()。他们的使用方法及注意事项如下:

1.scanf()

它是一种格式化的输入方式,可一次性按照规定的格式输入多个数据域。

scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。

scanf函数的一般形式为:

scanf(“格式控制字符串”,地址表列);

其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。

例如:&a、&b分别表示变量a和变量b的地址。

下面以输入规定的长度的字符串为例,来说说它的使用方法和容易产生的bug。

要求:定义一个长度为10的个字符数组,由用户通过键盘为其赋值。

Code:

char name[10];

scanf("%9s",name);

说明:之所以使用%9s是因为我们还需要预留一个位置给字符串结束标志'\0',所以用户输入的名字最长只能为9,且其中不能包含空格类字符(空格,回车,首行缩进符),因为scanf函数认为它们是字符串的结尾。

危险:当用户输入的名字超过9个衣服时,系统将会产生段错误(segment fault),如果运气好程序可能不会提示错误,如果不好,可能内存中重要的数据被覆盖!

2.fgets(char *name,int length,fd)

头文件:include

该函数从文件描述符fd指定的文件获得length个字符存入从name开始的length个内存单元中。由于其形参中规定了最大接受字符数,故不会发生像scanf函数那样的缓存溢出的问题。

要求:定义一个长度为10的个字符数组,由用户通过键盘为其赋值。

Code:

char name[10];

fget(name,sizeof(name),stdin);

说明:因为此处name是一个数组名,虽然它本质上是一个指针,但聪明的sizeof函数会把他区别于一般的指针变量,从而根据之前的定义求出数组的长度。但若是一般的指针变量,sizeof函数求出的值就是4或是8了。

3.gets()

它通过键盘获得字符串输入,并且没有任何字符串长度上的限制和检测,建议应该避免在我们的代码中使用该函数!

要求:定义一个长度为10的个字符数组,由用户通过键盘为其赋值。

Code:

char name[10];

gets(name);

注意:本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。为了避免这种情况,我们可以用fgets()来替换gets()。

危险:任何时候均要避免使用该函数,虽然它存在已经有很长一段时间了。

区别:

1.是否对用户输入的字符个数有所限制?

两者均有所限制,但scanf函数需要你在格式化说明符中显示注明,若不注明则无限制,可能会导致溢出事故;fgets函数则将其作为一个形参予以强制规定。

2.用户是否可以同时输入多个域的数据?

scanf函数可以通过添加多个格式化输入说明符来实现多域输入,而fgets函数每次仅能对一个域赋值。

3.用户输入的字符串中可以包含空格类字符吗?

scanf函数会把空格符当做字符串的结束符,故不可以在一个字符串中含有空格。而否则可以。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解相关推荐

  1. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

  2. python random randint_python中random.randint和random.randrange的区别详解

    在python中,通过导入random库,就能使用randint 和 randrange 这两个方法来产生随机整数.那这两个方法的区别在于什么地方呢?让我们一起来看看! 区别: randint 产生的 ...

  3. linux中cat、more、less命令区别详解

    linux中cat.more.less命令区别详解 转自:https://blog.csdn.net/xyw_blog/article/details/16861681 众所周知linux中命令cat ...

  4. python中randint是什么意思_python中random.randint和random.randrange的区别详解

    在python中,通过导入random库,就能使用randint 和 randrange 这两个方法来产生随机整数.那这两个方法的区别在于什么地方呢?让我们一起来看看! 区别: randint 产生的 ...

  5. decimal类型对象里面定义什么类型_MySQL中Decimal类型和Float Double的区别(详解)

    MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型. 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形 ...

  6. python定义数组并赋值_python中的数组赋值与拷贝的区别详解

    具体的注解我已经写在了程序里面:通俗的解释了python里面的浅拷贝与深拷贝的不同,请看程序. # -*- coding: utf-8 -*- import numpy as np import co ...

  7. php普通索引和唯一索引,MySQL中普通索引和唯一索引的区别详解

    本篇文章介绍了MySQL中普通索引和唯一索引的区别,讲解很详细,希望对学习MySQL的朋友有帮助! 需要注意的是: redo log中的数据,可能还没有 flush 到磁盘,磁盘中的 Page 1 和 ...

  8. MySQL中索引与视图的用法与区别详解

    索引与视图是我们在日常使用mysql必不可少的一部分,最近在学习中看到一本书中关于这方法写的不错,所以这篇文章主要给大家介绍了关于MySQL中索引与视图的使用与区别的相关资料,需要的朋友可以参考借鉴, ...

  9. c语言 sizeof size_t,C/C++中的sizeof运算符和size_t类型的详解

    sizeof的作用 sizeof是c的运算符之一,用于获取操作数被分配的内存空间,以字节单位表示. 这里指的操作数,可以是变量,也可以是数据类型,如int,float等.所以就可以通过它来获取本地c库 ...

  10. vue 加载时掉用mounted_Vue实例中生命周期created和mounted的区别详解

    前言 本文主要跟大家介绍了关于Vue实例中生命周期created和mounted区别的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 生命周期先上图 什么是生命周期 Vue ...

最新文章

  1. linux服务器查配置信息失败,查看Linux服务器的配置信息
  2. grafana 创建仪表盘_创建仪表盘前要问的三个问题
  3. idea离线安装lombock插件
  4. 奥鹏秋季计算机基础,14秋季奥鹏东北师范大学计算机应用基础离线作业
  5. USB转RS232串口应用
  6. fluent p1模型_FLUENT基本物理模型介绍
  7. wps怎么全选所有页_wps word中怎么全选一页
  8. 过滤dt中重复的记录
  9. css3制作手风琴,一步步教你css3手风琴效果的实现
  10. Transformer架构:位置编码
  11. 傅小兰研究员是学报第一任女主编吗?
  12. 《C语言及程序设计》实践参考——学生成绩统计
  13. 如何打包谷歌浏览器Chrome的扩展程序
  14. PHP图书管理系统实训心得体会,图书馆信息管理系统——总结
  15. 我最喜爱的九位历史人物 - 曾国藩(Space搬家)
  16. 微信公众号开发之自动消息回复
  17. fatal error C1189: #error : WRL requires NTDDI_VERSION to be #defined at least
  18. LabVIEW中的软件定时应用可以达到怎样的精度
  19. Android开发框架介绍
  20. 英语计算机工程技术学院,加拿大本科热门专业:电子与计算机工程

热门文章

  1. 批处理中setlocal enabledelayedexpansion
  2. Visual Studio调试时遇到的问题:生成下面模块时,启用了优化或没有调试信息
  3. ldd3笔记_3_编译模块
  4. Bitcoin.com支持BCH第N弹——派息神器SLP Dividend Calculator
  5. Windows XP Service Pack 3 RC2 简体中文版发布
  6. 并查集和prime和kruskal
  7. java中static作用详解
  8. If one day
  9. 【翻译 windbg - 1】Getting started with windbg - part I (第一部分 1)
  10. 嵌套母版页中的控件访问