我是C ++的新手。我想知道为什么我的代码无法正常工作。 我有一个名为Response的字符串。 如果响应以y / Y开头,则应继续。但是,当用户也键入“ y” /“ Y”(空白)时,我想继续。 这是我的代码。 预先感谢!
bool AskToPlayAgain()
{
std::cout << "Would you like to play again? Yes/N";
std::string Response = "";
std::getline(std::cin, Response);
return (Response[0] == 'y') || (Response[0] == 'Y' +) ||(Response[0] == ' y' +) (Response[0] == ' Y' +);
std::cout << std::endl;
}
答案 0 :(得分:1)
使用Response[0]
,您可以访问字符串的第一个字符。您可以将其与字符常量(例如'y'
)进行比较。但是,如果要允许前导空格,则不再是单个字符,因此比较Response[0] == ' y'
无法正常工作。
这里是一个允许使用任意多个空格字符的版本,然后是y或Y(C ++ 11版本):
for (auto c:Response)
if (c!=' ')
return (c=='y') || (c=='Y');
//string is only spaces
return false;
答案 1 :(得分:1)
在遍历时,您可以遍历字符串Response
并忽略空格(在这种情况下,我正在考虑Tabs
和Spaces
)。
如果第一个字符不是空格,那么您可以在这种情况下使用标志yes
来中断循环。
bool AskToPlayAgain()
{
std::cout << "Would you like to play again? Yes/N";
auto Response="";
std::getline(std::cin, Response);
auto yes = false;
auto itr = Response.begin();
while(itr != Response.end())
{
if(*itr != ' ' && *itr !='\t')
{
yes = (*itr == 'y' || *itr =='Y') ;
break;
}
++itr;
}
return yes;
}
答案 2 :(得分:0)
使用循环检查输入字符串中的每个字符...
例如,像这样,可以在所有C ++版本中使用常规循环( 您可以像上述答案中那样使用range based for loop ... ):
TableauPSL
亲切的问候,
Ruks。
答案 3 :(得分:0)
您可以从响应中删除空格,并仅选择'Y'/'y'。
bool AskToPlayAgain()
{
std::cout << "Would you like to play again? Yes/N";
std::string Response = "";
std::getline(std::cin, Response);
Response.erase(remove(Response.begin(), Response.end(), ' '), Response.end());
return (Response[0] == 'y') || (Response[0] == 'Y');
}
答案 4 :(得分:0)
也许您可以使用std :: find函数来解决问题。
bool AskToPlayAgain()
{
std::cout << "Would you like to play again? Yes/N";
std::string Response = "";
std::getline(std::cin, Response);
auto pos1 = Response.find("Y");
auto pos2 = Response.find("y");
if (pos1 != std::string::npos || pos2 != std::string::npos)
return true;
return false;
}