scanf输入getchar输入时读缓冲区问题

如果输入45 56 78回车,不应该一次输出45 56 78空格空格回车吗,输入45回车56
回车78回车,就一次输出45 56 78回车huichehuiche,但是运行的时候不是这样的


    int a,b,c;
    fflush(stdin);
    scanf("%d%d%d",&a,&b,&c);
    printf("%d %d %d",a,b,c);
    char d,e,f;
    scanf("%c%c%c",&d,&e,&f);
    printf("%c %c %c",d,e,f);
/*    d=getchar();               //与上面2行的scanf和printf等价
    e=getchar();
    f=getchar();
    putchar(d);
    putchar(e);
    putchar(f);    
*/  

因为scanf使用%d读取整数时,会把前面的空白字符略去,然后读完整数后,再把后面的非数字字符放回输入流;

所以,输入45 56 78回车,首先会把45,56,78依次读取到a,b,c,同时数之间的两个空格被忽略了,再把回车放回输入流,然后等待输入两个字符,就打印一个回车,然后是输入的两个字符;

同理,如果输入,45回车56回车78回车,同样是获取了46,56,78到变量a,b,c中,数之间的两个回车同样被忽略了,然后把最后一个回车放回输入流,等待输入两个字符,再打印回车,然后是输入的两个字符。

测试代码如下:

参考链接:


http://ascii.wjccx.com/

#include <stdio.h>

int main(void){
     
    int a,b,c;
    fflush(stdin);
    scanf("%d%d%d",&a,&b,&c);
    printf("%d %d %d\n",a,b,c);
    char d,e,f;
    scanf("%c%c%c",&d,&e,&f);
//    printf("%c %c %c",d,e,f);
    printf("d=%c,d=%d\n",d,d);
    printf("d=%c,d=%d\n",e,e);
    printf("d=%c,d=%d\n",f,f);
/*    d=getchar();               //与上面2行的scanf和printf等价
    e=getchar();
    f=getchar();
    putchar(d);
    putchar(e);
    putchar(f);    
*/  
    return 0;
}

img

参考GPT和自己的思路:

首先,使用 fflush(stdin) 是不可取的,因为其行为是未定义的。正确的做法是在 scanf 前使用 getchar 清空缓冲区,例如:

int a, b, c;
scanf("%d", &a);
getchar(); // 清空缓冲区
scanf("%d", &b);
getchar(); // 清空缓冲区
scanf("%d", &c);
printf("%d %d %d\n", a, b, c);

对于字符输入,类似的做法也可以用 getchar 代替 scanf:

char d, e, f;
d = getchar();
getchar(); // 清空缓冲区
e = getchar();
getchar(); // 清空缓冲区
f = getchar();
printf("%c %c %c\n", d, e, f);

注意,如果输入中包含空格或者其他非换行符的字符,且希望这些字符也能被正确读入,那么最好使用 fgets 函数或者自己实现一个按行读取输入的函数。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^