C语言if语句条件为真却不执行,输入0_0无法终止计算器循环
问题原因分析
- 执行顺序逻辑颠倒:你当前的代码是先判断
a[n]、operation[n]、b[n]的值,再执行scanf读入用户输入。第一次进入循环时,三个变量都是未初始化的栈区随机值,永远不可能命中0_0的判断条件。即便后续读入了0_0,读完后会立刻执行n++,下一轮循环判断的是新下标n对应的未初始化值,永远匹配不到你刚输入的内容。 - 下标索引逻辑错误:你每读入一组数据就将
n自增,所有已成功读入的有效数据都存储在下标0 ~ n-1的位置,你判断的下标n对应的位置从来没有被写入过用户输入,自然不可能触发判断条件。 - 额外潜在问题:数组长度仅为20,没有做边界判断,用户输入超过20组数据时会发生数组越界,引发内存访问错误。
修复方案
调整逻辑为:先读入用户输入,再判断是否是0_0终止符,如果是就跳出循环,否则再将下标自增存储下一组数据。如果需要兼容输入带空格的情况(比如3 + 5),可以把scanf的格式串改为%i %c %i,用格式串里的空格自动跳过输入的空白字符。
修复后的参考代码:
int a[20], b[20], result[20]; int n = 0; char operation[20]; printf("Enter:\n"); while(1) { // 最多存储19组有效运算题,预留1个位置读终止符,避免数组越界 if(n >= 19) { printf("已达到最大输入数量限制\n"); break; } scanf("%i%c%i", &a[n], &operation[n], &b[n]); // 读完当前输入后立刻判断是否为终止符 if(a[n] == 0 && operation[n] == '_' && b[n] == 0) { break; } n++; }
内容的提问来源于stack exchange,提问作者wybot
相关产品推荐
相关产品推荐

