c ++如何使用switch函数正确结束程序

时间:2017-07-31 02:02:16

标签: c++

我正在使用Microsoft Visual Studio 2017社区并对某些事情感到好奇。如何使用开关功能正确结束程序?我知道程序员肯定不会像exit()那样。我尝试过使用return 0;在不同的地方,如功能再见和转换,但没有运气,它只是结束功能或切换,但问题是它不会退出或关闭程序。也可以随意纠正任何可能出错或可能做得更好的事情。我对c ++很陌生,这是我的第一个程序。注意:试图避免将用户名设置为全局变量,但它在多个函数中使用,因此我继续使其成为全局变量。

这是我的例子:

#include <iostream>
#include <string>
#include <fstream>

/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
////                Switch does not end program on QUIT :(                   ////
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////

void welcome();

int options_menu();

void register_username();

std::string register_password();

void save_user(const std::string &password);

void user_login();
void display_file();

void clock_in_hour();
void clock_in_minute();
void clock_out_hour();
void clock_out_minute();

void test();

void goodbye();

std::string username;

template <typename T>
T get_input(const std::string &strQuery)
{
    std::cout << strQuery << "\n> ";
    T out = T();

    while (!(std::cin >> out))
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits <std::streamsize>::max(), '\n');
        std::cout << "Error!" "\n";
        std::cout << strQuery << "\n> ";
    }
    return out;
}

int main()
{
    welcome();
    options_menu();
    test();
    return 0;
}

void welcome()
{
    std::cout << "Welcome to the Time Card Calculator Pro V1.0 \n\n";
}

int options_menu()
{
    int menu = 0;

        std::cout << "Please type an option number and press enter to continue: \n\n";

        std::cout << "[1] Register \n";
        std::cout << "[2] Login \n";
        std::cout << "[3] Quit \n\n";

        menu = get_input <int>("Please type an option number and press enter to continue \n");

        switch (menu)
        {
        case 1:
            std::cout << "\n";
            std::cout << "You chose to register \n\n";
            register_username();
            break;
        case 2:
            std::cout << "\n";
            std::cout << "You chose to login \n\n";
            user_login();
            break;
        case 3:
            std::cout << "\n";
            std::cout << "You chose to quit \n\n";
            goodbye();
            break;
        default:
            std::cout << "\n";
            std::cout << "Error! Invalid option \n\n";
            options_menu();
            break;
        }
}

void register_username()
{
    std::string username;

    std::cout << "Please enter your full name: ";   //ask user to create username...
    std::cin.ignore();
    std::getline(std::cin, username);

    while (get_input <int>("Confirm? [0|1]") != 1)
    {
        std::cout << "Please enter your full name: ";
        std::cin.ignore();
        std::getline(std::cin, username);
    }

    std::ifstream file(username + ".txt");  //check if user file exists...
    if (file.is_open())
    {
        std::cout << "Error! Username already taken \n\n";
        options_menu();
    }
    else     //ask user to create a password...
    {
        register_password();
    }
}

std::string register_password()
{
    std::cout << "Now please create a password \n";
    std::string ask_password = get_input<std::string>("Password may not have any spaces ");
    std::string password = get_input<std::string>("Please re-enter the password ");

    if (ask_password == password)
    {
        save_user(password);
    }
    else
    {
        std::cout << "Error: Passwords did not match \n";
        register_password();
    }
    return password;
}

void save_user(const std::string &password)
{
    std::cout << "Saving user info... \n";

    std::ofstream file(username + ".txt");
    file << password << "\n";

    std::cout << "Username: " << username << "\n";
    std::cout << "Password: " << password << "\n";
}

void user_login()
{
    std::cout << "Please enter your username ";
    std::cin.ignore();
    std::getline(std::cin, username);

    std::cout << "Searching for file... \n";

    std::ifstream file(username + ".txt");  //look for user file...

    if (file.is_open())     //if user file is found...
    {
        std::cout << "File found \n";
        display_file();
    }
    else
    {
        std::cout << "Error: Username not registered \n";
        std::cout << "Please register username \n";
        options_menu();
    }
}

void display_file()
{
    std::string line;
    int numberoflines = 0;

    std::cout << "Searching for user file " << username << "\n";

    std::ifstream file(username + ".txt");
    while (std::getline(file, line))
    {
        std::cout << line << "\n";
        numberoflines++;
    }
}


void test()
{
    std::cout << "This is a test \n";
}

void goodbye()
{
    std::cout << "Thank you for using the Time Card Calculator Pro V1.0 \n";
    std::cout << "Good bye \n";
}

2 个答案:

答案 0 :(得分:1)

您需要将switch语句中的内容返回到主循环。主循环中的return 0是终止程序的原因。

int main()
{
    welcome();
    int exitNow = options_menu(); //lets say a -1 return is the symbol for exit
    while(exitNow != -1)
        exitNow = options_menu();
    test();
    return 0;
}

所以你的开关会是这样的:

int options_menu()
{
    int menu = 0;

        std::cout << "Please type an option number and press enter to continue: \n\n";

        std::cout << "[1] Register \n";
        std::cout << "[2] Login \n";
        std::cout << "[3] Quit \n\n";

        menu = get_input <int>("Please type an option number and press enter to continue \n");

        switch (menu)
        {
        case 1:
            std::cout << "\n";
            std::cout << "You chose to register \n\n";
            register_username();
            break;
        case 2:
            std::cout << "\n";
            std::cout << "You chose to login \n\n";
            user_login();
            break;
        case 3:
            std::cout << "\n";
            std::cout << "You chose to quit \n\n";
            goodbye();
            return -1;
            break;
        default:
            std::cout << "\n";
            std::cout << "Error! Invalid option \n\n";
            options_menu();
            break;
        }
     return 0;
}

答案 1 :(得分:0)

我刚刚解决了我的问题:)请告诉我这是否是一个不喜欢的exit()或system()。我不想像我到处读到的那样养成坏习惯。我尽量小心。这是我对我的问题的回答。我希望没关系。它确实有效。请注意,如果从菜单中选择退出,则不会调用测试函数(或在其之后或之后调用的任何函数)。 那么,现在退出选项有效,现在的问题是,这是一个好的代码吗?请随时给我建议或在任何地方纠正我,或让我养成良好的编程习惯。感谢大家花时间阅读长代码并借给我他们的见解。

#include <iostream>
#include <string>
#include <fstream>
#include <limits>

void welcome();

void options_menu();

void register_username();

std::string register_password();

void save_user(const std::string &password);

void user_login();
void display_file();

void test();

void goodbye();

std::string username;
int menu = 0;

template <typename T>
T get_input(const std::string &strQuery)
{
    std::cout << strQuery << "\n> ";
    T out = T();

    while (!(std::cin >> out))
    {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits <std::streamsize>::max(), '\n');
        std::cout << "Error!" "\n";
        std::cout << strQuery << "\n> ";
    }
    return out;
}

int main()
{
    welcome();
    options_menu();
    while (menu != 3)
    {
        test();
        return 0;
    }
    return 0;
}

void welcome()
{
    std::cout << "Welcome to the Time Card Calculator Pro V1.0 \n\n";
}

void options_menu()
{
    std::cout << "Please type an option number and press enter to continue: \n\n";
    std::cout << "[1] Register \n";
    std::cout << "[2] Login \n";
    std::cout << "[3] Quit \n\n";

    menu = get_input <int>("Please type an option number and press enter to continue \n");

        switch (menu)
        {
        case 1:
            std::cout << "\n";
            std::cout << "You chose to register \n\n";
            register_username();
            break;
        case 2:
            std::cout << "\n";
            std::cout << "You chose to login \n\n";
            user_login();
            break;
        case 3:
            std::cout << "\n";
            std::cout << "You chose to quit \n\n";
            goodbye();
            break;
        default:
            std::cout << "\n";
            std::cout << "Error! Invalid option \n\n";
            options_menu();
            break;
        }
}

void register_username()
{
    std::string username;

    std::cout << "Please enter your full name: ";   //ask user to create username...
    std::cin.ignore();
    std::getline(std::cin, username);

    while (get_input <int>("Confirm? [0|1]") != 1)
    {
        std::cout << "Please enter your full name: ";
        std::cin.ignore();
        std::getline(std::cin, username);
    }

    std::ifstream file(username + ".txt");  //check if user file exists...
    if (file.is_open())
    {
        std::cout << "Error! Username already taken \n\n";
        options_menu();
    }
    else     //ask user to create a password...
    {
        register_password();
    }
}

std::string register_password()
{
    std::cout << "Now please create a password \n";
    std::string ask_password = get_input<std::string>("Password may not have any spaces ");
    std::string password = get_input<std::string>("Please re-enter the password ");

    if (ask_password == password)
    {
        save_user(password);
    }
    else
    {
        std::cout << "Error: Passwords did not match \n";
        register_password();
    }
    return password;
}

void save_user(const std::string &password)
{
    std::cout << "Saving user info... \n";

    std::ofstream file(username + ".txt");
    file << password << "\n";

    std::cout << "File saved \n";
    std::cout << "Username: " << username << "\n";
    std::cout << "Password: " << password << "\n";
}

void user_login()
{
    std::cout << "Please enter your username ";
    std::cin.ignore();
    std::getline(std::cin, username);

    std::cout << "Searching for file... \n";

    std::ifstream file(username + ".txt");  //look for user file...

    if (file.is_open())     //if user file is found...
    {
        std::cout << "File found \n";
        display_file();
    }
    else
    {
        std::cout << "Error: Username not registered \n";
        std::cout << "Please register username \n";
        options_menu();
    }
}

void display_file()
{
    std::string line;
    int numberoflines = 0;

    std::cout << "Searching for user file " << username << "\n";

    std::ifstream file(username + ".txt");
    while (std::getline(file, line))
    {
        std::cout << line << "\n";
        numberoflines++;
    }
}

void test()
{
    std::cout << "This is a test \n";
}

void goodbye()
{
    std::cout << "Thank you for using the Time Card Calculator Pro V1.0 \n";
    std::cout << "Goodbye \n";
}

#include <iostream> #include <string> #include <fstream> #include <limits> void welcome(); void options_menu(); void register_username(); std::string register_password(); void save_user(const std::string &password); void user_login(); void display_file(); void test(); void goodbye(); std::string username; int menu = 0; template <typename T> T get_input(const std::string &strQuery) { std::cout << strQuery << "\n> "; T out = T(); while (!(std::cin >> out)) { std::cin.clear(); std::cin.ignore(std::numeric_limits <std::streamsize>::max(), '\n'); std::cout << "Error!" "\n"; std::cout << strQuery << "\n> "; } return out; } int main() { welcome(); options_menu(); while (menu != 3) { test(); return 0; } return 0; } void welcome() { std::cout << "Welcome to the Time Card Calculator Pro V1.0 \n\n"; } void options_menu() { std::cout << "Please type an option number and press enter to continue: \n\n"; std::cout << "[1] Register \n"; std::cout << "[2] Login \n"; std::cout << "[3] Quit \n\n"; menu = get_input <int>("Please type an option number and press enter to continue \n"); switch (menu) { case 1: std::cout << "\n"; std::cout << "You chose to register \n\n"; register_username(); break; case 2: std::cout << "\n"; std::cout << "You chose to login \n\n"; user_login(); break; case 3: std::cout << "\n"; std::cout << "You chose to quit \n\n"; goodbye(); break; default: std::cout << "\n"; std::cout << "Error! Invalid option \n\n"; options_menu(); break; } } void register_username() { std::string username; std::cout << "Please enter your full name: "; //ask user to create username... std::cin.ignore(); std::getline(std::cin, username); while (get_input <int>("Confirm? [0|1]") != 1) { std::cout << "Please enter your full name: "; std::cin.ignore(); std::getline(std::cin, username); } std::ifstream file(username + ".txt"); //check if user file exists... if (file.is_open()) { std::cout << "Error! Username already taken \n\n"; options_menu(); } else //ask user to create a password... { register_password(); } } std::string register_password() { std::cout << "Now please create a password \n"; std::string ask_password = get_input<std::string>("Password may not have any spaces "); std::string password = get_input<std::string>("Please re-enter the password "); if (ask_password == password) { save_user(password); } else { std::cout << "Error: Passwords did not match \n"; register_password(); } return password; } void save_user(const std::string &password) { std::cout << "Saving user info... \n"; std::ofstream file(username + ".txt"); file << password << "\n"; std::cout << "File saved \n"; std::cout << "Username: " << username << "\n"; std::cout << "Password: " << password << "\n"; } void user_login() { std::cout << "Please enter your username "; std::cin.ignore(); std::getline(std::cin, username); std::cout << "Searching for file... \n"; std::ifstream file(username + ".txt"); //look for user file... if (file.is_open()) //if user file is found... { std::cout << "File found \n"; display_file(); } else { std::cout << "Error: Username not registered \n"; std::cout << "Please register username \n"; options_menu(); } } void display_file() { std::string line; int numberoflines = 0; std::cout << "Searching for user file " << username << "\n"; std::ifstream file(username + ".txt"); while (std::getline(file, line)) { std::cout << line << "\n"; numberoflines++; } } void test() { std::cout << "This is a test \n"; } void goodbye() { std::cout << "Thank you for using the Time Card Calculator Pro V1.0 \n"; std::cout << "Goodbye \n"; }