在一个程序中发现了这个问题
#include<stdio.h>
int main() {
char a[4];
while(scanf(" %c%c%c%c\n",&a[0],&a[1],&a[2],&a[3]) == 4) {
printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);
}
return 0;
}
该程序实现包含4个字符的字符串的倒置
可是,该程序只是第一次运行正常
为什么会这样呢?
想了半天,原来是当你第一次输入四个字符并按下Enter键之后,由于scanf函数读取的是缓存区的数据
所以当打印出字符串中的元素之后,你输入的'\n'被当成了下一次输入的a[0],因此只有第一次运行正确
怎样改进呢?
1.在VC下,可以使用fflush(stdin)函数用来清空缓存区的数据。然而,C和C++的标准里从来没有定义过 fflush(stdin)。
因此在GCC下运行会报错
2.把第一次的输入作为特殊情况,第二次及以后的输入进行这样的处理
//第一次的输入
if((scanf("%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {
printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);
}
//第二次及以后的输入,注意输入时的空格
while(scanf("空格%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {
printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);
}
这样处理之后会将上次输入的'\n'与该空格符对应
3.在每次输出之后,调用getchar()函数,"吃掉" '\n'
while(scanf("%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {
printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);
getchar();
}
4.当输入的是字符串时,使用scanf要注意,字符串不能带有空格,因为scanf读到空格就会跳出。此时可使用gets()函数;
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
#include<stdio.h>
int main() {
char a[4];
while(scanf(" %c%c%c%c\n",&a[0],&a[1],&a[2],&a[3]) == 4) {
printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);
}
return 0;
}
该程序实现包含4个字符的字符串的倒置
可是,该程序只是第一次运行正常
为什么会这样呢?
想了半天,原来是当你第一次输入四个字符并按下Enter键之后,由于scanf函数读取的是缓存区的数据
所以当打印出字符串中的元素之后,你输入的'\n'被当成了下一次输入的a[0],因此只有第一次运行正确
怎样改进呢?
1.在VC下,可以使用fflush(stdin)函数用来清空缓存区的数据。然而,C和C++的标准里从来没有定义过 fflush(stdin)。
因此在GCC下运行会报错
2.把第一次的输入作为特殊情况,第二次及以后的输入进行这样的处理
//第一次的输入
if((scanf("%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {
printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);
}
//第二次及以后的输入,注意输入时的空格
while(scanf("空格%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {
printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);
}
这样处理之后会将上次输入的'\n'与该空格符对应
3.在每次输出之后,调用getchar()函数,"吃掉" '\n'
while(scanf("%c%c%c%c",&a[0],&a[1],&a[2],&a[3]) == 4) {
printf("%c%c%c%c\n",a[3],a[2],a[1],a[0]);
getchar();
}
4.当输入的是字符串时,使用scanf要注意,字符串不能带有空格,因为scanf读到空格就会跳出。此时可使用gets()函数;
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!