初学C常见问题
来源:互联网 发布:谷歌放弃python 编辑:程序博客网 时间:2024/05/21 09:12
问题一.从键盘输入值时, 回车后出现几行沾在一起、多行合并在一起的, 从而导致不能正确读取的问题
代码:
#include <stdio.h>main(){ char a, b, c; printf("输入a: "); scanf("%c", &a); printf("输入b: "); scanf("%c", &b); printf("输入c: "); scanf("%c", &c);}
结果:
原因:
用户从键盘输入的字符(回车,也是一个字符),都会先进入缓冲区,程序按占位符逐个读取数据,字符在被读取后,才会消失,否则会一直存在于缓冲区,直至被读取。
所以在输入 4 后, 用户回车(\n)以确定输入后.
此时, 缓冲区有: ‘4’ ‘\n’所以scanf(“%c”, &a);读取了‘4’, 把4给了a,
由于缓冲区还有‘\n’, 所以scanf(“%c”, &b); 自动从缓冲区读取了‘\n’, 并把‘\n’给了b
由于自动从缓冲区读取(不用按回车键), 便没有换行(几行沾在一起、合并在一起), b的数据也读取不成功
解决:
- 在第2,3,4…条读取字符的scanf()的语句前加getchar();
#include <stdio.h>main(){ char a, b, c; printf("输入a: "); scanf("%c", &a); getchar(); // 添加getchar();把回车符读取 printf("输入b: "); scanf(" %c", &b); getchar(); // 添加getchar();把回车符读取 printf("输入c: "); scanf(" %c", &c);}
- 在scanf中的%c前加空格 冲走‘\n’
#include <stdio.h>main(){ char a, b, c; printf("输入a: "); scanf("%c", &a); printf("输入b: "); scanf(" %d", &b); // 用空格冲走'\n' printf("输入c: "); scanf(" %c", &c); // 用空格冲走'\n'}
注意:
需要注意的是,是由于按了回车导致,并且下一条scanf语句(读取的第一个字符是%c)能读取‘\n’,才会导致行合并,无法正确读取的问题
而%d会自动冲掉‘\n’, 所以不需要在%d前加冲掉‘\n’的操作
示例:
#include <stdio.h>main(){ char a, b, c; printf("输入a: "); scanf("%c", &a); printf("输入b: "); scanf("%d", &b); printf("输入c: "); scanf("%c", &c);}
scanf(“%c”, &a); 成功读取了‘4’给a
scanf(“%d”, &b); 不为%c,无法自动读取%c,不会出现行合并的的问题
成功读取了5给bscanf(“%c”, &c); 由于缓冲区有‘\n’(且没有加冲掉‘\n’的操作),就自动读取了‘\n’
PS: char 也可以看作为数值, 所以scanf(“%d”, &b);是可以的
阅读全文
0 0
- 初学C常见问题
- 初学C常见问题
- HelloWorld常见问题(Java初学)
- php初学常见问题
- lua初学常见问题解惑
- JAVA初学常见问题
- 初学jsp常见问题
- 初学S60,常见问题记录
- Lua初学常见问题解析
- Android初学常见问题
- 初学Loadrunner常见问题记录
- Linux初学常见问题
- FFmpeg的初学习常见问题
- 初学C#
- 初学C
- 初学C
- 初学C
- 初学C
- JavaWeb网站用Servlet实现前后台交互
- php Linux下常用的几个函数
- 有关字符的零碎知识点
- javaScript中三大家族总结
- 对日方向的程序员怎么快速学习日语
- 初学C常见问题
- Android Studio运行程序出现Session ‘app’: Error Launching activity 解决办法
- QT使用QPainter绘图
- Hello World!
- [Leetcode] 203. Remove Linked List Elements 解题报告
- 熵和编码长度以及交叉熵
- 从Google Chrome中删除“由企业策略安装的”扩展名
- 学习笔记——JAVA设计模式<12>责任链模式
- 简单粗暴实现Zxing二维码