概述
用scanf进行输入时,从键盘键入的字符放到了stdin的缓冲区,这个输入缓冲区和stdout的缓冲区一样,是行缓冲的,在遇到换行符"\n"时才刷新,所以在输入完后,回车才完成一次输入。但是对于整数浮点数、字符和字符串的输入,存在一些差异。
具体体现
进行整数和浮点数的输入时,将分隔符(包括空格、tab、enter)和除数字小数点外的其他字符作为非法字符,输入的时候比较随意。
进行字符串的输入时,将分隔符(包括空格、tab、enter)作为非法字符。
进行字符的输入时,所有符号都是合法的,包括作为输入结束标志的换行符"\n"。如果不想要这个字符,或者不想输入某些字符,有如下两三种方式:
1、如果明确知道输入缓冲区不想要的字符的个数,可以用getchar()函数。
2、如果已经取完一轮字符,取下一轮时需要清除掉缓冲区中剩下字符,比如"\n"和多输入的一些字符,可以用fflush(stdin),但某些编译器可能不支持。
3、可以用temp=getchar()逐个取出字符,判断是否是自己不期望的,如果是,则取下一个,如果不是,则用ungetc(temp, stdin)把方才去的字符推入到stdin中,然后用scanf()正常读取。
代码如下:
int my_scanf(char *pchar);
int my_scanf(char *pchar)
{
char temp;
while ((temp = getchar()) != '\n') {
ungetc(temp, stdin);
if (scanf("%c", pchar) == 1) {
return 0;
}
else {
return -1;
}
}
}