原文: (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 接收,这样就不会出现接收错值的情况了

最新文章

  1. CentOS matplotlib 安装
  2. bzoj1396: 识别子串
  3. ubuntu.sh: 113: ubuntu.sh: Syntax error: "(" unexpected
  4. java.io.Serializable浅析
  5. SQL server语句测试
  6. USACO2016 January Gold Angry Cows
  7. Windows Server 2008远程桌面默认端口更改方法
  8. Maven版本不一致的时候,使用指定版本进行编译
  9. Android开发中如何使用RecyclerView
  10. [总结] wqs二分学习笔记
  11. JavaScript之函数调用与被调用的上下文对象this
  12. 注解图Annotation
  13. MediaCodec在Android视频硬解码组件的应用
  14. Two Melodies CodeForces - 813D (DP,技巧)
  15. Zabbix利用orabbix插件监控Oracle数据库
  16. shell知识积累
  17. PHP MVC单入口
  18. Nginx服务器抵御CC攻击的相关配置讲解
  19. 【Android】3.13 路径规划功能
  20. 苹果微信浏览器不能post方式提交数据问题

热门文章

  1. VMware虚拟机中共享文件夹 开机启动
  2. jenkins:用jenkins通过ssh部署jar包到远程linux机器(jdk 15 / jenkins 2.257)
  3. git merge 与 git rebase的区别?
  4. win安装appium
  5. sql中的Bulk 导入txt文本
  6. sql ROW_NUMBER() 排序函数
  7. 用Hugo在gitee上构建博客(Windows环境下)
  8. 通俗的讲解Python中的__new__()方法
  9. Synergy屏幕共享键鼠 (for Mac&Ubuntu)
  10. libhiredis.so.0.13: cannot open shared object file: No such file or directory in Unknown on line