所以它经常出现在我的课程中,我需要能够有一个用户可以多次做事的程序。
所以我写了像
这样的东西boolean continue=true;
while (continue) {
//do code
boolean isAnswerGood=false;
while (!isAnswerGood) {
cout << "Do you wish to continue" << endl;
string answer;
getline(cin, answer);
if (answer=="y") //or something else
isAnswerGood=true;
else if (answer=="n") {
isAnswerGood=true;
continue=false;
} else
cout << "That wasnt "y" or "n" please type something again" << endl;
}
}
这看起来很臃肿,很多代码都是如此简单。我愿意在这个盒子外面思考,所以如果有人能给我一个更好的解决方案的线索,我会很感激。
答案 0 :(得分:4)
将其分解为单独的函数。 (几乎总是答案“如何写一个雄辩的......?”)
例如:
do {
// something
} while (UserWantsMore());
/////////
bool UserWantsMore() {
std::string answer = GetAnswer("Continue?");
while (!GoodAnswer(answer))
answer = GetAnswer("Please answer 'yes' or 'no'!");
return IsAnswerYes(answer);
}
bool GoodAnswer(const std::string& answer) {
return !answer.empty() && (answer[0] == 'y' || answer[0] == 'n');
}
bool IsAnswerYes(const std::string& answer) {
return !answer.empty() && answer[0] == 'y';
}
std::string GetAnswer(const char* prompt) {
std::cout << prompt << std::cend;
std::string answer;
std::getline(std::cin, answer);
return answer;
}
答案 1 :(得分:3)
抱歉,这是关于适量的代码。与其他一些语言相比,C和C ++相对冗长。
但是,如果这是一个常见问题,您可以将其抽象出来并从中创建一个函数。该函数与您已有的函数非常相似,但之后您会将其称为:
boolean again = true;
while (again) {
// do code
again = ask_user("Do you wish to continue?", "y", "n");
}
ask_user()
的论点应该是要问的问题,接受的答案意味着“是”,接受的答案意味着“不”。可以使用第二个和第三个参数来生成错误消息(关于意外输入),因此我们实际上不需要将其传入。
当然,问题可能比这更复杂......如果您的代码将由非英语人士使用,该怎么办?如果您需要处理本地化,您可以创建一个包含错误消息的所有字符串传入的基本函数,然后创建一个用户使用语言规范调用的包装器。这是一个例子,这次使用C ++中的“无限循环”:
for (;;) {
// do code
if (!ask_user_yesno("en_us")) // locale: English, USA
break;
}
答案 2 :(得分:2)
如果你只是想用更少的代码来制作你已经拥有的东西,那么这将有效。
string answer="y";
while (answer=="y") {
//do code
for(;;) {
cout << "Do you wish to continue" << endl;
getline(cin, answer);
if ((answer=="y")||(answer=="n")) break;
cout << "That wasnt \"y\" or \"n\" please type something again" << endl;
}
}
代码略少,但稍微混淆了一些:
string answer="y";
while (answer!="n") {
if (answer=="y") {
//do code
} else {
cout << "That wasnt \"y\" or \"n\" please type something again" << endl;
}
cout << "Do you wish to continue" << endl;
getline(cin, answer);
}
这是一个使用<termios.h>
来获得答案的版本。它使用了更多代码,但行为更“雄辩”。
int getch (void)
{
int c;
struct termios oldt;
struct termios newt;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
c = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return c;
}
bool again (std::string prompt, std::string yes, std::string no)
{
bool doyes = false;
bool dono = false;
for (;;) {
std::cout << prompt;
int c = getch();
std::cout << std::endl;
doyes = (yes.find(c) != yes.npos);
dono = (no.find(c) != no.npos);
if (doyes || dono) break;
std::cout << "Type [" << yes << "] for yes, or [" << no << "] for no.";
std::cout << std::endl;
}
return doyes;
}
您可以像其他人建议的那样使用它:
do {
// the interesting code
} while (again("Do you wish to continue? ", "y", "n"));
答案 3 :(得分:0)
如下:
void DoYesCode()
{
// Do the code for the yes stuff...
}
...
do{
cout << "Do you wish to continue" << endl;
string answer;
getline(cin, answer);
if (answer=="y")
DoYesCode();
else if (answer=="n")
break;
else
cout << "That wasnt 'y' or 'n' please type something again" << endl;
} while(true);