C语言的scanf()函数在接收输入单个字符时会把上一次输入的回车符号当做这次输入的字符,造成无法正确的输入字符数据。这恐怕是初学C的童鞋门遇到的最头疼的问题了。今天给大家提供四种解决方法供借鉴。
-
在scanf()中使用'\n'屏蔽回车符号。
scanf("%d\n",&n); //使用'\n'过滤回车
scanf("%c",&c);
-
在scanf()格式串最前面添加空格,屏蔽回车字符
scanf("%d",&n);
scanf(" %c",&c); //%c前面加空格,过滤回车
-
在接收字符前,使用getchar()来读取一次回车符号
scanf("%d",&n);
getchar(); //专门用来读取上次输入的回车符号
scanf("%c",&c);
-
在接收字符前,使用fflush()清空输入流中缓冲区中的内容
scanf("%d",&n)
fflush(stdin); //清空输入流缓冲区的字符,注意必须引入#include <stdlib.h>头文件
scanf("%c",&c);
gets(s)函数与 scanf("%s",&s) 相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。
1.scanf()
所在头文件:stdio.h
语法:scanf("格式控制字符串",变量地址列表);
接受字符串时:scanf("%s",字符数组名或指针);
2.gets()
所在头文件:stdio.h
语法:gets(字符数组名或指针);
两者在接受字符串时:
1.不同点:
scanf不能接受空格、制表符Tab、回车等;
而gets能够接受空格、制表符Tab和回车等;
2.相同点:
字符串接受结束后自动加'\0'。
例1:
#include <stdio.h>
int main()
{
char ch1[10],ch2[10];
scanf("%s",ch1);
gets(ch2);
return 0;
}
依次键入asd空格fg回车,asd空格fg回车,则ch1="asd\0",ch2="asd fg\0"。
程序2:
#include <stdio.h>
int main()
{
char str1[20], str2[20];
scanf("%s",str1);
printf("%s\n",str1);
scanf("%s",str2);
printf("%s\n",str2);
return 0;
}
程序的功能是读入一个字符串输出,再读入一个字符串输出。可我们会发现输入的字符串中不能出现空格,例如:
测试一输入:
Hello word(enter)
输出:
Hello
world!
程序3:
#include <stdio.h>
int main()
{
char str1[20], str2[20];
gets(str1);
printf("%s\n",str1);
gets(str2);
printf("%s\n",str2);
return 0;
}
测试:
Helloworld! [输入]
Helloworld! [输出]
12345 [输入]
12345 [输出]
【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个字符串取了Helloworld! 接受了空格符,而没有像上一个程序那样分成了两个字符串!所以如果要读入一个带空格符的字符串时因该用gets(), 而不宜用scanf()!