编写UVa习题的时候,我发现使用scanf输入多个字符的区域总是会莫名其妙地停止运行,像下面这样。
接下来做几个小实验:
int main() { char ch1,ch2,ch3; scanf("%c%c%c",&ch1,&ch2,&ch3); printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3); printf("ch1=%d,ch2=%d,ch3=%d\n",ch1,ch2,ch3); return 0; }
输入a b c
结果是:
结果很明显,空格被当作字符存入了ch2。
那么回车呢?
很明显,回车也被当作字符存入ch2了。
注:
scanf(“%c%c%c”,&ch1,&ch2,&ch3);
与
scanf(“%c”,&ch1);
scanf(“%c”,&ch2);
scanf(“%c”,&ch3);
等价!
调用ctype.h头文件中的isalpha( )函数。
函数功能为判定字符是否为字母,这样就可以避免录入不必要的空格或回车。
int main() { char ch1,ch2,ch3; while( scanf("%c",&ch1) && !isalpha(ch1)); while( scanf("%c",&ch2) && !isalpha(ch2)); while( scanf("%c",&ch3) && !isalpha(ch3)); printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3); printf("ch1=%d,ch2=%d,ch3=%d\n",ch1,ch2,ch3); return 0; }
每次用scanf输入时调用“fflush(stdin);”。
功能是清空文件缓冲区,但副作用是不能在一行内输入所有字符了,需要分行输入。
int main() { char ch1,ch2,ch3; fflush(stdin); scanf("%c",&ch1); fflush(stdin); scanf("%c",&ch2); fflush(stdin); scanf("%c",&ch3); printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3); printf("ch1=%d,ch2=%d,ch3=%d\n",ch1,ch2,ch3); return 0; }