C语言的scanf()函数在接收输入单个字符时会把上一次输入的回车符号当做这次输入的字符,造成无法正确的输入字符数据。这恐怕是初学C的童鞋门遇到的最头疼的问题了。
今天给大家提供四种解决方法供借鉴。
1、在scanf()中使用'\n'屏蔽回车符号。
scanf("%d\n",&n); //使用'\n'过滤回车
scanf("%c",&c);
2、在scanf()格式串最前面添加空格,屏蔽回车字符
scanf("%d",&n);
scanf(" %c",&c); //%c前面加空格,过滤回车
3、在接收字符前,使用getchar()来读取一次回车符号
1
2
3
|
scanf ( "%d" ,&n);
getchar (); //专门用来读取上次输入的回车符号
scanf ( "%c" ,&c);
|
4、在接收字符前,使用fflush()清空输入流中缓冲区中的内容
1
2
3
|
scanf ( "%d" ,&n)
fflush (stdin); //清空输入流缓冲区的字符,注意必须引入#include <stdlib.h>头文件
scanf ( "%c" ,&c);
|
好了,以后再也不用为这个问题烦恼了.....
补充知识:C语言中使用scanf()对字符(串)进行输入的问题
1. 输入字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include<stdio.h>
int main() {
int a;
char s1[100];
char s2[100];
scanf ( "%d" , &a);
scanf ( "%s" , s1);
scanf ( "%s" , s2);
printf ( "a = %d\n" , a);
printf ( "s1 = %s\n" , s1);
printf ( "s2 = %s\n" , s2);
return 0;
}
|
输入
1
2
3
|
2019
hello
world
|
输出
1
2
3
|
a = 2019
s1 = hello
s2 = world
|
没有问题,因为scanf("%s")遇到换行符会自动跳过
2.输入字符
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include<stdio.h>
int main() {
int a;
char s1;
char s2;
scanf ( "%d" , &a);
scanf ( "%c" , &s1);
scanf ( "%c" , &s2);
printf ( "a = %d\n" , a);
printf ( "s1 = %c\n" , s1);
printf ( "s2 = %c\n" , s2);
return 0;
}
|
输入
1
2
3
|
2019
A
B
|
输出
1
2
3
|
a = 2019
s1 =
s2 = A
|
可以看到s1将2019后面的回车符'\n'吸收了,原因是scanf("%c")在读取单个字符时,空格和回车都被视为单个字符。
解决办法
使用getchar()吸收掉多余的回车
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include<stdio.h>
int main() {
int a;
char s1;
char s2;
scanf ( "%d" , &a);
getchar (); // 吸收"\n"
scanf ( "%c" , &s1);
getchar (); // 吸收"\n"
scanf ( "%c" , &s2);
printf ( "a = %d\n" , a);
printf ( "s1 = %c\n" , s1);
printf ( "s2 = %c\n" , s2);
return 0;
}
|
在格式串中过滤掉回车
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include<stdio.h>
int main() {
int a;
char s1;
char s2;
scanf ( "%d\n" , &a); // 过滤掉回车
scanf ( "%c\n" , &s1);
scanf ( "%c" , &s2);
printf ( "a = %d\n" , a);
printf ( "s1 = %c\n" , s1);
printf ( "s2 = %c\n" , s2);
return 0;
}
|
以上这篇解决C语言输入单个字符屏蔽回车符的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.51cto.com/simoniu/1419199