初学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的数据也读取不成功


解决:

  1. 在第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);}
  1. 在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给b

scanf(“%c”, &c); 由于缓冲区有‘\n’(且没有加冲掉‘\n’的操作),就自动读取了‘\n’

PS: char 也可以看作为数值, 所以scanf(“%d”, &b);是可以的

原创粉丝点击