C printf()函数不显示输出内容

#include<stdio.h>
int main()
{
    char c;
    int letters=0,spaces=0,digits=0,others=0;
    printf("请输入一些字母:\n");
    while((c=getchar())!='\n')
    {
        if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
            letters++;
        else if(c>='0'&&c<='9')
            digits++;
        else if(c==' ')
            spaces++;
        else
            others++;
    }
    printf("字母=%d,数字=%d,空格=%d,其他=%d\n",letters,digits,spaces,others);
    return 0;
}

运行上面的代码,本意是提示用户输入,可是程序编译运行后只有光标闪烁并看不到提示语,在光标后输入 2 5后,程序才出现提示语:“请输入一些字母:”,并且运算结果也正确。

原因:

printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:

1 缓冲区填满

2 写入的字符中有"\n" "\r"

3 调用fflush手动刷新缓冲区

4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新

当然,执行printf的进程或线程结束后,会自动调用fflush刷新缓冲区。
缓冲区大小1024字节。

那么如何让我们的提示语出现呢?使用fflush()函数强制刷新缓冲区就可以了,上面的程序改为

#include<stdio.h>
int main()
{
    char c;
    int letters=0,spaces=0,digits=0,others=0;
    printf("请输入一些字母:\n");
    fflush(stdout); // 强制刷新缓存区
    while((c=getchar())!='\n')
    {
        if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
            letters++;
        else if(c>='0'&&c<='9')
            digits++;
        else if(c==' ')
            spaces++;
        else
            others++;
    }
    printf("字母=%d,数字=%d,空格=%d,其他=%d\n",letters,digits,spaces,others);
    return 0;
}

再次编译运行,这次就是我们想要的效果了。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐