You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

修改方案

  1. 给每个case的代码块添加大括号{},将变量定义包裹在局部作用域内,确保变量的初始化和销毁都局限在当前case分支里,避免跳转带来的问题。
  2. 修正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,提问作者Дина

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:40:19