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

