Scanf函数的缓冲区问题
scanf输入字符串、整型、实型等数据判断的方式都一样,回车、空格、tab键都认为是一个数据的结束。但是字符不同于字符串,回车,空格很可能被当成字符被输进去,要特别注意!回车、空格等都有对应的ASCII码,所以用scanf输入字符时要小心这些东西被当成字符输进去,而输入字符串和整型、实型等数据时这些都被当成分隔符而不会被输入到字符数组或变量里。当然如果输入格式不是"%s%s"而是"%s,%s"分隔符就是逗号了。
直接举例子
#include <stdio.h>
Int main()
{
char src[100];
char str[100];
scanf(“%s”,src);
scanf(“%s”,str);
printf(“src = %s\n”,src);
printf(“str = %s\n”,str);
return 0;
}
输入
hello回车 world 回车
运行结果为
src = hello
str = world
总结一下就是:
如果scanf输入的不是字符,那么分隔符为回车,空格、tab键时,两个数据之间的分隔符只是起区别两个数据的作用,把分隔好的两个数据分别赋值到各自定义好的变量,数组或字符串中去,两个数据之间的分隔符被从缓冲区读出但是不起任何作用,当然最后一个'\n '会被留在缓冲区内,除非用getchar();或scanf("%c",&c);把它读出来。
例2
#include <stdio.h>
int main()
{
char src[100];
scanf("%s",src);
printf("src = %s\n",src);
return 0;
}
输入 hello空格world(即hello world)
运行结果
src = hello
分析:当输入空格的时候,就被当成了结束符,只有hello被输入到字符数组src中
解决方法:将输入语句改成:scanf("%[^\n]",src);即可
对于字符
也是直接举例子
#include <stdio.h>
int main()
{
int a;
char src;
scanf(“%d”,&a);
scanf(“%c”,&src);
printf(“a = %d\n”,a);
printf(“src = %c\n”,src);
return 0;
}
输入
123回车
运行结果
a = 123
src =
分析:回车作为ASCII码输入到了缓冲区,直接给了字符src
解决方法:可在两个输入语句中间加入一个 getchar();
或者在字符的输入语句%c前面加上一个空格 即改成scanf(“ %c”,&src);