You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Eclipse搭配MinGW时C程序printf与scanf_s执行顺序异常求助

问题原因与解决方案

这个问题并非Eclipse本身的问题,根源在于标准输出的缓冲机制。

C语言中stdout默认是行缓冲模式:只有当输出内容包含换行符\n、缓冲区被填满,或者程序结束时,缓冲区里的内容才会被刷新到控制台。你的代码里最后一个printf没有添加换行符,而MinGW环境下调用scanf_s这类输入函数时,不会自动刷新stdout缓冲区,导致之前的输出都暂存在缓冲区里,直到程序后续流程才被输出;而Visual Studio的C运行时库(CRT)在调用输入函数时会自动刷新stdout,所以表现符合预期。

三种解决办法:

  1. 手动刷新缓冲区
    在scanf_s之前调用fflush(stdout)强制刷新输出缓冲区,确保所有printf内容先输出到控制台:
#include <stdio.h>

int main(void)
{
    int s;
    printf("** Service Ticket Center **\n");
    printf(" Choose from the following options.\n");
    printf(" 1. Create new ticket.\n");
    printf(" 2. Update ticket status.\n");
    printf(" 3. Delete ticket.\n");
    printf(" 4. Find ticket.");
    fflush(stdout); // 手动触发缓冲区刷新
    scanf_s("%d", &s);
    return 0;
}
  1. 给最后一行输出添加换行符
    利用行缓冲的特性,给最后一个printf加上\n,触发自动刷新:
#include <stdio.h>

int main(void)
{
    int s;
    printf("** Service Ticket Center **\n");
    printf(" Choose from the following options.\n");
    printf(" 1. Create new ticket.\n");
    printf(" 2. Update ticket status.\n");
    printf(" 3. Delete ticket.\n");
    printf(" 4. Find ticket.\n"); // 添加换行符触发刷新
    scanf_s("%d", &s);
    return 0;
}
  1. 禁用标准输出缓冲
    在程序开头将stdout设置为无缓冲模式,让所有输出直接打印到控制台:
#include <stdio.h>

int main(void)
{
    setvbuf(stdout, NULL, _IONBF, 0); // 关闭stdout缓冲
    int s;
    printf("** Service Ticket Center **\n");
    printf(" Choose from the following options.\n");
    printf(" 1. Create new ticket.\n");
    printf(" 2. Update ticket status.\n");
    printf(" 3. Delete ticket.\n");
    printf(" 4. Find ticket.");
    scanf_s("%d", &s);
    return 0;
}

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:30:32