在C语言程序中,字符数据的输入很容易出错,尤其是和其它类型的数据混在一起时。例如下面的程序:
# include “stdio.h”
int main()
{
int a;
char c;
scanf(“%d”,&a);
c= getchar();
printf(“c = %c\n”, c);
return 0;
}
运行时,当输入一个整数后回车,则程序马上结束,并没有停下来让用户输入字符,只打印出“c =”。或者输入一个整数后加空格,再输入一个字符,最后回车,得到的结果是相似的。这个问题的原因是输入的回车或者空格被当做一个字符接收了。
解决办法是:在输入字符之前用fflush函数将输入缓冲区清空。程序如下:
# include “stdio.h”
int main()
{
int a;
char c;
scanf(“%d”,&a);
fflush(stdin);
c= getchar();
printf(“c = %c\n”, c);
return 0;
}
在windows平台下用Dev C++ 编译运行上面的程序,的确可以正确接收字符了。但是把程序放到Mac OS平台下,用Xcode编译运行时,还是不能正确接收字符。这主要是因为ANSI C规定函数fflush()处理输出数据流、确保输出缓冲区中的内容写入文件,但并未对清理输入缓冲区作出任何规定,只是部分编译器增加了此项功能,因此导致了fflush函数在移植时出现问题。
在Xcode下,可以用setbuf函数来解决上述问题,程序如下:
# include “stdio.h”
int main()
{
int a;
char c;
scanf(“%d”,&a);
setbuf(stdin, NULL);
c= getchar();
printf(“c = %c\n”, c);
return 0;
}