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

如何用scanf在同一行获取单个或多个输入并支持输入-1退出

解决输入单个"-1"退出程序的问题

原代码的问题在于,scanf("%d %f")要求必须输入两个值(整数+浮点数)才能成功匹配。当你只输入-1时,scanf会匹配失败,input1的取值不确定,而且输入缓冲区里的-1会一直残留,导致后续的scanf反复尝试读取都失败,程序陷入死循环。

要实现输入单个-1就退出的功能,应该先读取整行输入,判断内容是否为-1,再决定是退出还是解析两个输入值。具体实现如下:

#include <stdio.h>
#include <string.h>

int main() {
    int input1;
    float input2;
    char buffer[100]; // 定义足够大的缓冲区存储整行输入

    while (1) {
        printf("Enter: ");
        // 读取整行输入,遇到EOF则退出
        if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
            break;
        }

        // 去掉末尾的换行符(如果存在)
        size_t len = strlen(buffer);
        if (len > 0 && buffer[len-1] == '\n') {
            buffer[len-1] = '\0';
        }

        // 判断是否是退出指令"-1"
        if (strcmp(buffer, "-1") == 0) {
            break;
        }

        // 尝试解析整数和浮点数
        if (sscanf(buffer, "%d %f", &input1, &input2) == 2) {
            // 这里可以添加对输入值的业务处理
            printf("输入的整数:%d,浮点数:%.2f\n", input1, input2);
        } else {
            printf("输入格式错误,请输入「整数+浮点数」,或输入-1退出\n");
        }
    }

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

关键说明

  • fgets():一次性读取整行输入,包括空格和换行,彻底避免scanf的部分匹配、缓冲区残留问题
  • 去除换行符:fgets()会把换行符也读入缓冲区,必须替换成字符串结束符\0,否则strcmp无法匹配"-1"
  • strcmp(buffer, "-1"):严格判断输入内容是否为纯-1,确保只有输入单个-1时才触发退出
  • sscanf()返回值:只有返回2时,说明成功解析了整数和浮点数,否则提示格式错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:05:27