C语言控制台计算器树结构存储变量时scanf读取异常问题
C语言控制台计算器变量输入异常问题解决方案
问题根因
你遇到的scanf直接读取表达式后续内容的核心原因是输入缓冲区残留了预先输入的表达式内容:
你是一次性输入完整表达式(比如a+2),整个字符串包括后续的+2和换行符都会提前存入系统输入缓冲区。当tree_check函数内调用scanf("%lf")读取变量值时,%lf格式符不会触发等待用户手动输入的逻辑,会直接从已有缓冲区中读取符合浮点数格式的内容,你例子中的2就被错误识别为变量a的取值。
除此之外你的代码还存在以下可优化/修复的点:
tree_check函数缺少完整返回逻辑:仅实现了空树节点的返回分支,变量已存在的场景无返回值,会触发未定义行为- 变量名拷贝使用
memcpy风险更高:传入的变量名是带\0结束符的字符串,用strcpy更适配字符串拷贝场景 - main函数中打印变量值的
printf语句末尾缺少分号,会导致编译失败
修复方案
- 每次调用
scanf读取变量值前,先清空输入缓冲区残留内容,强制scanf等待用户新输入 - 补全
tree_check的二叉搜索树查找逻辑,支持已有变量的取值 - 修复语法错误
修复后的核心代码示例
/* 补全后的tree_check函数 */ double tree_check(tree** t, char* c) { int j = 0; double b; int ch; if (*t == NULL) { tree* t_helper = (tree*)malloc(sizeof(tree)); strcpy(t_helper->name, c); t_helper->left = NULL; t_helper->right = NULL; printf("Input value "); while (c[j] >= 'a' && c[j] <= 'z' && j != 7) printf("%c", c[j++]); printf(":\n"); // 清空缓冲区残留的表达式内容 while ((ch = getchar()) != '\n' && ch != EOF); scanf("%lf", &b); t_helper->value = b; *t = t_helper; return (*t)->value; } // 补全二叉搜索树查找逻辑 int cmp_res = strcmp(c, (*t)->name); if (cmp_res == 0) { return (*t)->value; } else if (cmp_res < 0) { return tree_check(&(*t)->left, c); } else { return tree_check(&(*t)->right, c); } }
/* main函数修复点 */ printf("Variable: %lf", d); // 补充分号
内容的提问来源于stack exchange,提问作者NEXIS
相关产品推荐
相关产品推荐

