我正在使用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";
}
答案 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";
}