C语言程序逻辑异常:需循环结束后输出,输入R即触发输出
代码逻辑问题修复方案
异常根本原因
- 当前代码将账户余额的打印逻辑直接嵌入在
while循环的case 'R'分支内部,程序每读取到R指令就会立刻触发打印操作,不会等待所有输入流程走完、循环因读取Q指令终止后再统一输出。 - 原有循环结构存在漏洞:如果程序读取到既不是
R也不是Q的操作指令,switch没有对应分支处理,也不会更新operationCode的值,会直接进入死循环。
具体调整逻辑
- 移除
case 'R'分支内所有即时打印的代码,仅保留操作标记的占位逻辑。 - 将余额打印的代码段,移到
while循环完全退出之后的位置,确保只有当用户输入Q、循环终止时,才会触发最终结果的计算与输出。 - 把读取下一条操作指令的逻辑,统一放到switch分支之后的循环固定位置,避免不同分支漏读输入导致的死循环。
调整后可运行代码
int main() { float amountOfTurkishLira = 0; float amountOfBtc = 0; float amountOfEth = 0; char operationCode; char operationTurkishLira; // 读取初始类型校验指令 scanf(" %c", &operationTurkishLira); if (operationTurkishLira != 'T') { printf("Error: Operation could not be completed."); } else { // 读取初始土耳其里拉入账金额 scanf(" %f", &amountOfTurkishLira); // 读取第一条流程操作指令 scanf(" %c", &operationCode); while (operationCode != 'Q') { switch (operationCode) { case 'R': // R指令仅作为流程标记,不触发即时输出 break; // 后续可在此处补充其他操作分支的业务逻辑 } // 统一读取下一条操作指令 scanf(" %c", &operationCode); } // 循环终止(输入Q)后统一输出账户余额 if (amountOfBtc == 0 && amountOfEth == 0) { printf("Our account holds %.2f TRY\n", amountOfTurkishLira); } else { printf("Our account holds %.2f TRY | %.2f BTC | %.2f ETH.\n", amountOfTurkishLira, amountOfBtc, amountOfEth); } printf("Bye.."); } return 0; }
修复后运行效果
按照测试输入序列T、1000、R、Q执行时,程序会依次读取完全部输入内容后,再统一触发结果输出,与预期逻辑完全一致。
内容的提问来源于stack exchange,提问作者Ehsan Kaamil
相关产品推荐
相关产品推荐

