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

使用scanf()与fgets()处理含括号逗号分隔的不定长输入问题求助

C语言括号嵌套输入解析问题修复

核心问题排查

你现有代码无法读取括号内整数的核心原因有3个:

  • 第一个scanf("%d", &address)执行后,输入流中第一个数字后残留的空格会被后续的scanf("%c", &paren)读取,导致paren值为空格,直接不满足while循环条件,整个括号内读取逻辑直接跳过
  • 读取数组元素的scanf缺少取地址符&,无法将读取到的数值写入数组对应内存位置
  • 格式串"%d,"要求数字后紧跟逗号,但你的输入里数字和逗号之间存在空格,格式匹配失败,后续读取逻辑全部错乱

修复方案

利用scanf格式串开头加空格可自动跳过所有空白字符(空格、换行、制表符)的特性,不用手动处理输入中的零散空格,优化后的逻辑如下:

#include <stdio.h>

int main() {
    int address;
    int adjoined_room[100]; // 按实际需要的最大长度调整定义
    int current_room = 0;
    char paren;
    char item[100]; // 存储末尾的字符串

    // 读取第一个整数
    scanf("%d", &address);

    // 跳过空白后读取左括号
    scanf(" %c", &paren);
    // 格式容错判断,可按需补充异常处理逻辑
    if (paren != '(') {
        return 1;
    }

    // 循环读取括号内的整数
    while (1) {
        // 先跳过空白,判断下一个字符是不是右括号
        scanf(" %c", &paren);
        if (paren == ')') {
            break;
        }
        // 不是右括号的话把刚才读的字符塞回流中,继续读整数
        ungetc(paren, stdin);
        // 读整数存入数组
        scanf("%d", &adjoined_room[current_room]);
        current_room++;
    }

    // 跳过空白读取末尾的字符串,读到换行结束
    scanf(" %[^\n]", item);

    // 测试打印验证
    printf("Address: %d\n", address);
    printf("Adjoined rooms: ");
    for (int i = 0; i < current_room; i++) {
        printf("%d ", adjoined_room[i]);
    }
    printf("\nItem: %s\n", item);

    return 0;
}

关键逻辑说明

  • scanf格式串开头加空格会自动跳过所有前导空白,完美适配你输入中数字、逗号、括号之间的零散空格
  • 用ungetc把提前读取的判断字符塞回输入流,避免因为预读导致整数读取出错
  • 不用硬匹配逗号,不管括号内是用逗号分隔还是空格分隔的整数都能正常识别,兼容性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:09:01