C语言含scanf的递归程序问题:输入')'被误判为'\n'
问题分析与解决
你的递归函数遇到的核心问题是终止逻辑不符合嵌套表达式的解析需求,同时对scanf的行为理解有误:
scanf(" %c", &expCh)格式串开头的空格会自动跳过所有空白字符(包括空格、换行、制表符),正常情况下你永远不会读到'\n'作为expCh的值——除非输入流中已经没有其他非空白字符。你说读到)时被误判为'\n',本质是当前代码只有'\n'一个终止条件,没有处理)这个嵌套表达式的结束符,导致递归流程混乱。要解析
(1 + 1)这类嵌套表达式,需要明确递归的触发和终止条件:遇到(时递归解析内部表达式,遇到)或输入结束('\n')时终止当前递归层级。
修改后的示例代码
#include <stdio.h> int nestedExpression() { char expCh; // 若需保留空格则用"%c",若要跳过空格则用" %c" scanf("%c", &expCh); // 终止条件:输入结束 或 遇到表达式闭合符')' if (expCh == '\n' || expCh == ')') { return 0; } // 遇到'('时递归解析内部嵌套 if (expCh == '(') { nestedExpression(); } else { // 这里添加数字、运算符等字符的处理逻辑 // 示例:打印当前处理的字符 printf("处理字符: %c\n", expCh); } // 继续解析后续字符 nestedExpression(); return 0; } int main() { printf("输入表达式:"); nestedExpression(); return 0; }
关键说明
- 如果不需要处理空格,保留
scanf(" %c", &expCh)即可,此时空格会被自动跳过,不会进入处理逻辑。 - 递归过程中需根据字符类型分支处理:
(触发递归,)终止当前递归,其他字符按需做业务处理。
内容的提问来源于stack exchange,提问作者rei
相关产品推荐
相关产品推荐

