C语言如何使用flushall函数

#include<stdio.h>

int main()
{   int a,b,s;
    printf("输入一个整数:");
    scanf("%d",&a);
    while(a==0)
    {
    printf("输入错误! 输入一个整数:");
    scanf("%d",&a);
    }
    b=a;
    s=0;
    while(a!=0)
    {
    s++;
    a=a/10;
     }
    printf("输出:%d是一个%d位整数",b,s);
    return 0;
}


以上是我写的,但是无法正常运行,有一个死循环
要用flushall函数清空缓存区,不太知道如何使用
以下为原题目

img

提前感谢解答,与帮助

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在 C 语言中,使用 fflush(stdin) 函数可以清空输入缓冲区。注意,该函数只能被用于清空输出流,而不能用于清空输入流,因为 C 标准没有规定 fflush(stdin) 的行为。但是,在某些编译器中,fflush(stdin) 可能会被解释为清空输入缓冲区的操作。

在使用 fflush(stdin) 函数之前,要确保输入缓冲区中没有未被处理的数据。如果输入缓冲区中有未被处理的数据,那么使用 fflush(stdin) 函数将会导致未定义的行为。

下面是一个使用 fflush(stdin) 函数的例子,该例子可以读入一个整数,如果读入的不是整数,那么程序会清空输入缓冲区,并提示重新输入:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, count;
    char c;

    do {
        printf("请输入一个整数:");
        count = scanf("%d", &n);
        if (count != 1) {
            printf("输入错误!请重新输入。\n");
            fflush(stdin); // 清空输入缓冲区
            continue;
        }
    } while (count != 1);

    printf("%d 是一个 %d 位整数。\n", n, count);

    return 0;
}

注意,fflush(stdin) 函数在 C 标准中并没有定义,因此并不是所有的编译器都支持该函数。如果你遇到了 fflush(stdin) 函数无法使用的问题,可以考虑使用其他方法来清空输入缓冲区。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

scanf那里错了,需要使用一个变量记录其返回值用于判断正确获取输入数据的个数;

然后需要在while循环中使用fflush()函数来清空缓冲区。

修改如下:



#include<stdio.h>
 
int main()
{   int a,b,s;
    printf("输入一个整数:");
    int num=scanf("%d",&a); // 从输入获取一个整数,并将scanf()函数的返回值赋值给num,用于判断正确获取输入的个数 
    while(num==0)  // 如果正确输入的个数为0,则清空缓冲区,并重新从输入获取一个整数 
    {
        fflush(stdin);  // 使用fflush()清空缓冲区 
        printf("输入错误! 输入一个整数:");
        num=scanf("%d",&a);  // 重新从输入获取一个整数,并用num存储scanf()的返回值 
    }
    
    // 计算输入的整数a的位数 
    b=a;
    s=0;
    while(a!=0)
    {
    s++;
    a=a/10;
     }
     
     // 打印结果 
    printf("输出:%d是一个%d位整数",b,s);
    return 0;
}
 
 

img

  • 这篇博客: 多进程写同一个日志并发问题分析中的 flush的非原子性 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 通过上面的分析,我们知道,flush操作的时候,缓冲区中的数据,它是调用write系统调用来写磁盘,写入的数据能保证原子性。但是,但是,这里的缓冲区数据,它未必能够保证一次性全部写完。即是A、B进程都有1K字节缓冲区,调用write一次写1K字节,可能返回500字节,那此时,B进程可以调用write写入500字节,A再写完剩下的500字节,再写剩下的B进程的500字节。这种情况下,那么,flush操作则会导致日志的乱序,原因找到。