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

如何在含scanf_s的项目中用scanf实现按回车退出程序?

问题原因

你的代码在包含scanf_s的项目里失效,核心原因是输入缓冲区残留:scanf_s读取用户输入后,你按下的回车键对应的'\n'会留在标准输入缓冲区中。后续调用fgetc(stdin)时,直接读取到了缓冲区里的残留换行符,不会等待用户新的输入,所以看起来没触发输入提示。

用scanf/scanf_s实现按回车退出的方案

以下是几种可行的实现方式,适配带有scanf_s的项目场景:

方案1:先清理缓冲区,再用scanf_s捕获回车

先清空scanf_s留下的缓冲区残留,再等待用户按下回车:

#include <stdio.h>

int main()
{
    // 示例:项目中已有的scanf_s代码
    int input_num;
    scanf_s("%d", &input_num);

    // 跨平台清理输入缓冲区(替代fflush(stdin),避免未定义行为)
    int temp_ch;
    while ((temp_ch = getchar()) != '\n' && temp_ch != EOF)
    {
        // 跳过缓冲区中所有残留字符
    }

    char ch;
    // 等待用户按下回车键
    while (scanf_s("%c", &ch, 1) == 1 && ch != '\n')
    {
        // 跳过用户可能输入的其他字符,直到捕获到回车
    }

    printf("\n程序退出\n");
    return 0;
}

方案2:用scanf格式串直接匹配回车

通过scanf的格式控制,自动跳过非换行字符并捕获回车,无需额外清理:

#include <stdio.h>

int main()
{
    // 示例:项目中已有的scanf_s代码
    float input_float;
    scanf_s("%f", &input_float);

    // 等待用户按下回车键:先跳过所有非换行字符,再读取换行符
    scanf("%*[^\n]");  // %*表示读取但不存储,[^\n]匹配所有非换行字符
    scanf("%*c");      // 读取并丢弃换行符

    printf("\n程序退出\n");
    return 0;
}

关键说明

  • 避免使用fflush(stdin):该操作是微软编译器的非标准扩展,在其他平台(如Linux)属于未定义行为,跨平台场景建议用循环读取的方式清理缓冲区。
  • 如果你的场景中不需要处理用户可能输入的其他字符,也可以简化为直接调用getchar(),但前提是确保缓冲区已被清空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:31:37