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
相关产品推荐
相关产品推荐

