原文: (https://www.myjinji.top/articles/2020/07/22/1595399358246.html)[https://www.myjinji.top/articles/2020/07/22/1595399358246.html]

header

scanf 和 getchar 都是c中的输入函数,但它们在用法和原理上有着不同的地方,在刚开始使用时犯了很多错误,写篇博客总结一下;

scanf

int scanf(const char *format, ...)

scanf() 函数属于格式化函数,按照指定的既定格式从键盘上将数据输入到指定的变量中;

因为在 scanf() 语句中的格式中没有非格式字符在 "%d%d%d" 之间作为输入时的间隔,所以在输入时一定要用一个以上的空格或者回车作为两个输入数之间的间隔符

tips: scanf() 在读取数字时会自动跳过空格、制表符和换行符

实例1

	int a, b, c;

	printf("input int: ");

	scanf("%d%d%d", &a, &b, &c);

	printf("%d%d%d", a, b, c);

实例2

在变量为数字类型时,程序运行一切正常,我们将变量换成字符试试

	char a, b, c;
printf("please input num a:\n");
scanf("%c", &a); printf("please input num b:\n");
scanf("%c", &b); printf("please input num c:\n");
scanf("%c", &c); printf("%c, %c, %c", a, b ,c);

输出变得古怪了起来,程序没有让我们输入b的值,而是直接到了c,难道说b没有值吗?

并不是,b其实有数据,并且也输出了。我们可以分析一下源码,在输入1之后,我们按下了回车; 在c语言中回车键代表一个换行符(\n),于是立马就被b给接收了,之后就开始输入c的值。按照我们的输出语句,结果会按照a, b, c的格式输出它们的值,我们已经知道了a = 1, b = '\n', c = 2,所以结果才会显示为两行;

在说明 scanf 函数的时候就已经说了,scanf() 在接收数字的时候会自动略过空格、制表符、换行符,但在接收字符时就没有任何设置,所以就照单全收了;

getchar

int getchar(void)
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

说完 scanf() 该聊聊 getchar() 了,与 scanf 一次能接收多个字符不同的是,getchar 每次只能读取单个字符

实例1

	char a;

	a = getchar();

	printf("输入的字符是 %c", a);

即使我们输入了多个字符,getchar() 也只会读取一个字符

总结

根据 scanf 和 getchar 的特性,我们可以将这两个函数结合起来使用,将上面的代码修改一下

	char a, b, c;

	printf("please input num a:\n");
scanf("%c", &a);
getchar(); printf("please input num b:\n");
scanf("%c", &b);
getchar(); printf("please input num c:\n");
scanf("%c", &c); printf("%c, %c, %c\n", a, b, c);

我们将每次回车所产生的换行符使用 getchar 接收,这样就不会出现接收错值的情况了

详解scanf与getchar的更多相关文章

  1. Linux C 字符串输入函数 gets()、fgets()、scanf() 详解

    一.gets() 函数详解 gets()函数用来从 标准输入设备(键盘)读取字符串直到 回车结束,但回车符('\n')不属于这个字符串. 调用格式为: gets(str); 其中str为字符串变量(字 ...

  2. Linux C 字符函数 getchar()、putchar() 与 EOF 详解

    首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main() { int c; c = getc ...

  3. [转]keil使用详解

    第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...

  4. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  5. qsort函数详解

    C语言标准库函数 qsort 详解 文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. 原文链接:http://www.slyar.c ...

  6. 20160204.CCPP体系详解(0014天)

    程序片段(01):define.h+data.h&data.c+control.h&control.c+view.h&view.c+AI.h&AI.c+main.c 内 ...

  7. 20160203.CCPP体系详解(0013天)

    程序片段(01):数组.c+02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h> //0 ...

  8. 20160129.CCPP体系详解(0008天)

    程序片段(01):函数.c+call.c+测试.cpp 内容概要:函数 ///函数.c #include <stdio.h> #include <stdlib.h> //01. ...

  9. 20160124.CCPP详解体系(0003天)

    程序片段(01):HelloCGI.c 内容概要:CGI_HelloWorld #include <stdio.h> //01.CGI程序的编写规范 // (1).HTML文本格式声明后面 ...

随机推荐

  1. Java NIO:选择器

    最近打算把Java网络编程相关的知识深入一下(IO.NIO.Socket编程.Netty) Java NIO主要需要理解缓冲区.通道.选择器三个核心概念,作为对Java I/O的补充, 以提升大批量数 ...

  2. kubernetes:用kubeadm管理token(kubernetes 1.18.3)

    一,token的用途: 1,token是node节点用来连接master节点的令牌字串, 它和ca证书的hash值是把一台node节点加入到kubernetes集群时要使用的凭证 2, 通过kubea ...

  3. centos8平台基于iftop监控网络流量

    一,iftop的作用: 基于ip统计外部机器与本机之间的网络流量, 可以方便的查看各客户端是否有非正常的到本机的访问 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnbl ...

  4. centos8平台使用lscpu查看cpu信息

    一,lscpu所属的包: [root@yjweb ~]# whereis lscpu lscpu: /usr/bin/lscpu /usr/share/man/man1/lscpu.1.gz [roo ...

  5. 关于Dockerfile

    在Docker中创建镜像最常用的方式,就是使用Dockerfile.Dockerfile是一个Docker镜像的描述文件,我们可以理解成火箭发射的A.B.C.D-的步骤.Dockerfile其内部包含 ...

  6. PHP SPL标准库-迭代器

    通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器. PHP中迭代器是通过Iterator 接口定义的. ArrayIterator迭代器 foreach ...

  7. 第十二章 Linux三剑客之老三—grep

    一.Linux grep 命令用于查找文件里符合条件的字符串. Linux系统中的grep命令是一种功能强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep全称是Global ...

  8. CDH+Kylin三部曲之三:Kylin官方demo

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. 循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

    在我们一般系统中,往往都会涉及到附件的处理,有时候附件是图片文件,有时候是Excel.Word等文件,一般也就是可以分为图片附件和其他附件了,图片附件可以进行裁剪管理.多个图片上传管理,及图片预览操作 ...

  10. 关于windows下redis的安装

    1.下载地址:https://github.com/MSOpenTech/redis/releases 2.DOS下进redis文件夹目录,执行redis-server.exe redis.windo ...