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

C语言解析两种格式任意数量用户输入并调用对应函数的实现

现有代码核心问题梳理

  • 字符串比较逻辑错误:strcmp(&branch, "C")属于典型误用,strcmp要求参数是以\0结尾的字符串,而branch是单个char变量,直接用branch == 'C'做单字符比较即可,这个问题是O类型输入错误进入C分支的核心原因。
  • 匹配逻辑顺序错误:先执行%c%zu的格式匹配时,只要首字符后跟着数字,不管首字符是C还是O都会匹配成功,自然不会走到O的分支判断。
  • 循环逻辑冗余:外层while(1)完全多余,fgets读到EOF时会返回NULL,跳出内层循环后又会被外层死循环拉回再次调用fgets,此时stdin已经是EOF状态,fgets直接返回NULL,就会进入空转死循环,也就是你说的程序挂起。
  • 格式匹配不严谨:你需要匹配的是带方括号的C[xxx]/O[xxx]格式,现有sscanf格式符完全没有处理方括号,解析出来的数值必然不符合预期。

修复后可运行实现

#include <stdio.h>
#include <ctype.h>

#define BUFFER_SIZE 256

// 自定义C类型输入处理函数
void handle_size_t(size_t val) {
    printf("已处理C类型输入,数值:%zu\n", val);
}

// 自定义O类型地址处理函数
void handle_addr(void* addr) {
    printf("已处理O类型输入,地址:%p\n", addr);
}

int main()
{
    char input[BUFFER_SIZE];
    size_t num;
    void* addr;

    // 不需要外层while(1),fgets读到EOF自动终止
    while (fgets(input, BUFFER_SIZE, stdin) != NULL) {
        // 跳过行首空白,兼容输入带空格/换行的场景
        char* p = input;
        while (isspace((unsigned char)*p)) p++;
        if (*p == '\0') continue; // 空行直接跳过

        if (*p == 'C') {
            // 严格匹配C[xxx]格式
            if (sscanf(p, "C[%zu]", &num) == 1) {
                handle_size_t(num);
            } else {
                fprintf(stderr, "格式错误,正确格式为C[数值]\n");
            }
        } else if (*p == 'O') {
            // 严格匹配O[地址]格式,%p是标准C用来解析内存地址的格式符
            if (sscanf(p, "O[%p]", &addr) == 1) {
                handle_addr(addr);
            } else {
                fprintf(stderr, "格式错误,正确格式为O[内存地址]\n");
            }
        } else {
            fprintf(stderr, "未知输入类型%c,仅支持C/O开头的输入\n", *p);
        }
    }

    return 0;
}

关键逻辑说明

  • 支持任意数量、任意顺序的输入,用户按下Ctrl+D(Linux/macOS)或Ctrl+Z(Windows)即可正常退出程序,不会出现挂起问题。
  • 先判断首字符再做对应格式匹配,彻底避免不同类型输入的分支误判。
  • sscanf格式串严格匹配方括号,只有符合你要求的输入格式才会解析成功。
  • 自动跳过空行和行首空白,容错性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:39:01