Ngoài sự đảo ngược rõ ràng giữa & & và || tất cả các câu trả lời nói về, hãy để tôi đi một chút nữa, để làm cho sai lầm khác hiển nhiên (không phải thực sự là một lỗi, nhưng một điểm yếu thiết kế): bạn hỏi "có hay không" chấp nhận bất cứ điều gì và nếu câu trả lời trông giống như "yes" bạn lối thoát. Bất cứ điều gì khác chơi như một không. Thậm chí "một tách cà phê".
Và đảo ngược tất cả logic có cùng một sai lầm: kiểm tra N, n, Không, không để quyết định không thoát nghĩa là thoát nếu "trà và bánh quy" được trả lời.
Ngoài ra, getAnswer
mất trả lời và gọi chooseOptions
(mà lần lượt sẽ nhận được một số đầu vào để cung cấp cho getAnswer
): bạn không looping: bạn là recoursing. Và bạn đang làm một điều tương tự (nhận được câu trả lời từ một đầu vào) từ hai nơi khác nhau. Điều gì xảy ra nếu tôi muốn thay đổi std::cin
bằng một số luồng khác? Mọi thứ sẽ thay đổi? Ở bao nhiêu địa điểm khác nhau?
Một logic tốt hơn nhiều nên buộc các câu trả lời cho phù hợp.
Trong chương trình chính của bạn, bạn nên làm hầu như cái gì đó như
bool do_exit = false;
while(!do_exit)
{
//All useful stuff and then ...
do_exit = getAnswer(std::cin, std::cout,
"Do you want to exit? [yes/no]",
"please answer yes or no");
}
Hoặc, ngắn gọn hơn,
for(bool do_exit=false, !do_exit, do_exit=getAnswer(
"Do you want to exit? [yes/no]",
"please answer yes or no"))
{
//usefull stuff here
}
Bây giờ, cho phép nhận được vào logic câu trả lời:
Bạn phải có được một dòng đầu vào (không chỉ một từ: một dòng, kể từ khi tôi có thể gõ "vâng, tôi muốn"), do đó cin>>string
không chơi tốt: tốt hơn std::get_line
. Nếu đó là "có" trả về true, nếu "không" trả về false và nếu bất cứ điều gì khác lặp lại việc đọc.
bool getAnswer(std::istream& istr, std::ostream& ostr,
const std::string& prompt, const std::string& reprompt)
{
ostr << prompt << std::endl;
for(;;)
{
std::string line;
std::getline(istr,line);
if(line == "yes" || line == "Yes" || line == "Y" || line == "y")
return true;
if(line == "no" || line == "No" || line == "N" || line == "n")
return false;
ostr << reprompt << std::end;
}
}
Điều này khiến bạn chấp nhận các biến thể "có hoặc không" nổi tiếng, nhưng từ chối bất kỳ điều gì khác.
Đi thậm chí furtherly, chúng ta có thể cosider ý kiến cho rằng cin/cout thể loại khác của suối, và có thể không có ai "gõ".
Để tránh đi vào một vòng lặp vô hạn, chúng ta có thể giới thiệu một giới hạn nỗ lực và ném một ngoại lệ nếu nó đạt được:
bool getAnswer(std::istream& istr, std::ostream& ostr,
const std::string& prompt, const std::string& reprompt)
{
ostr << prompt << std::endl;
for(int attempt=5; attempt>0; --attempt)
{
std::string line;
std::getline(istr,line);
if(line == "yes" || line == "Yes" || line == "Y" || line == "y")
return true;
if(line == "no" || line == "No" || line == "N" || line == "n")
return false;
if(attempt>1)
ostr << reprompt << " ("<<attempt-1<<" attempts remaining)"<<std::endl;
}
throw std::domain_error("cannot get valid input");
}
và để cho người gọi để cuối cùng bắt và thực hiện một số hành động khác, hoặc cuối cùng duyên dáng chấm dứt.
Hơn nữa, chúng tôi có thể tham số không chỉ là i/o và các câu hỏi, mà còn là câu trả lời, nhưng điều này đang đi quá xa.
Thay đổi '||' thành '&&'. – Maroun
tại sao && bây giờ tôi thực sự bối rối. trong khi không có hoặc không có sau đó giữ vòng lặp, nếu "có" hoặc "không", sau đó phá vỡ các vòng lặp – airsoftFreak
tôi thêm lời giải thích như một câu trả lời vì nó không phù hợp với nhận xét. – Maroun