Jump Bypasses Variable Initialization in Switch Statement

I need an std:: vector<char> or an std:: string in my switch case for some purpose. So, I wrote the following dummy code to see if it works:

#include <iostream>
#include <string>
int main() {
    int choice = 0;

    do {
        std:: cout << "Enter Choice" << std::endl;
        std:: cin >> choice;

        switch(choice) {
            case 1:
                std::cout << "Hi";
                break;

            case 2:
                std::string str;
                std::cin >> str;
                break;

            case 3: //Compilation error, Cannot jump from switch statement to this case label
                std::cout << "World" << std:: endl;
                break;

            default:
                std:: cout << "Whatever" << std:: endl;
        }

    } while(choice != 5);
    return 0;
}

Ok, I somewhat got it that str is an object of std:: string type. So, I am trying to jump through this variable initialization.

Then why a definition of C style string does not cause compilation error:

#include <iostream>
#include <string>
int main() {
    int choice = 0;

    do {
        std:: cout << "Enter Choice" << std::endl;
        std:: cin >> choice;

        switch(choice) {
            case 1:
                std::cout << "Hi";
                break;

            case 2:
                char str[6];
                std::cin >> str;
                break;

            case 3:
                std::cout << "World" << std:: endl;
                break;

            default:
                std:: cout << "Whatever" << std:: endl;
        }

    } while(choice != 5);
    return 0;
}

How can I make the first code to work?

2 Answers

char str[6]; is default-initialized. In case of C arrays of simple values with automatic storage duration ("allocated on stack") it means "no initialization at all", so I guess it's not an error.

If you, however, initialize the array like char str[6] = {}, it will yield an error.

I suggest you put extra curly braces so str is in its own scope and is not visible in further case statements:

#include <iostream>
#include <string>
int main() {
    int choice = 0;

    do {
        std:: cout << "Enter Choice" << std::endl;
        std:: cin >> choice;

        switch(choice) {
            case 1:
                std::cout << "Hi";
                break;

            case 2: {  // Changed here
                std::string str;
                std::cin >> str;
                break;
            }
            case 3: // `str` is not available here, no compilation error
                std::cout << "World" << std:: endl;
                break;

            default:
                std:: cout << "Whatever" << std:: endl;
        }

    } while(choice != 5);
    return 0;
}

Where to put brackets is a styling preference.

2

Just create a new block for the variable with an extra pair of braces

        case 2:
        { // <-- start new block for str
            std::string str;
            std::cin >> str;
            break;
        } // <-- end of block, str will be destroyed here
3

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Sophia Al-Mansoor

Sophia Al-Mansoor

Global Business & E-Commerce Reporter

Sophia analyzes international trade, startup ecosystems, retail transformation, and supply chain logistics for modern digital publications.

Share this article
Twitter Facebook Pinterest