scanf读输入缓存引发的问题

在一个程序中发现了这个问题
#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结束输入(空格不结束),接受空格,会舍弃最后的回车符!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值