switch case中使用ifstream报jump to case label错误的解决方法
问题分析与解决
错误原因
编译器报jump to case label的核心问题是:在switch的case 1分支里直接定义了ifstream file2和char ch2变量,而switch的case标签之间是直接跳转的,会绕过这些变量的初始化流程。C++不允许跳过带有非平凡构造函数的对象(比如ifstream)的初始化,这会导致未定义行为。
另外代码里还有个隐藏bug:两个while循环的条件third_q != 1 || third_q != 2逻辑错误,这个条件永远为真(不管third_q是1还是2,总有一个不等式成立),会导致循环无限执行,需要改成third_q != 1 && third_q != 2。
修改方案
- 给每个case的代码块添加大括号
{},将变量定义包裹在局部作用域内,确保变量的初始化和销毁都局限在当前case分支里,避免跳转带来的问题。 - 修正while循环的条件判断逻辑,把
||改成&&。
修改后的完整代码
#include <iostream> #include <fstream> #include <cmath> using namespace std; float bank(int third_q, int forth_q) { int k; ifstream file1("vklad1.txt"); char ch1; while (file1.get(ch1)) { cout << ch1; } file1.close(); cin >> third_q; // 修正循环条件:从||改为&& while (third_q != 1 && third_q != 2) { switch(third_q) { case 1: { // 添加大括号形成局部作用域 double sum, percent, duration, end_sum; cout << "Введите сумму своих сбережений:"; cin >> sum; cout << endl; cout << "Введите процент вклада:"; cin >> percent; cout << endl; cout << "Введите количество лет (если процент годовой) или месяцев (если процент месячный) на которые вы планируете положить деньги на вклад:"; cin >> duration; cout << endl; cout << "Итоговая сумма будет равна "; end_sum = sum * pow((1 + percent/100), duration); cout << end_sum << '\n'; k = 1; break; } case 2: k = 1; break; default: cout << "Неверный ввод, повторите попытку." << '\n'; cin >> third_q; break; } if (k == 1) { break; } } cout << "Хотите ли вы узнать о рисках, связанных с этим вариантом вложения?\n1)Да\n2)Нет" << endl; cin >> forth_q; // 修正循环条件:从||改为&& while (forth_q != 1 && forth_q != 2) { switch (forth_q) { case 1: { // 添加大括号形成局部作用域 ifstream file2("vklad2.txt"); char ch2; while (file2.get(ch2)) { cout << ch2; } file2.close(); k = 2; break; } case 2: k = 2; break; default: cout << "Неверный ввод, повторите попытку." << '\n'; cin >> forth_q; break; } if (k == 2) { break; } } return 0; }
关键修改点说明
- 给
case 1分支的代码加上{}后,ifstream file2和char ch2的作用域被限制在这个大括号内,switch跳转时不会再绕过它们的初始化,编译器也就不会报错。 - 修正while循环条件后,只有当输入不是1也不是2时才会进入循环,符合逻辑,避免无限循环。
内容的提问来源于stack exchange,提问作者Дина
相关产品推荐
相关产品推荐

