因为我在C ++中做了一些事情已经有一段时间了,但是我的while循环中出现了一个非常奇怪的行为。它旨在允许用户执行无限数量的命令,并确定通过字符串的内容执行哪些命令。
以下是感兴趣的代码:
string run;
size_t found;
bool understood;
while (true)
{
run = "";
found = string::npos;
cout << "Please enter command(s)" << endl;
cout << "\> ";
cin >> run;
found = run.find("convert");
cout << found << endl;
understood = false;
if (found != string::npos)
{
cout << "Converting DNA" << endl;
understood = true;
convert();
}
found = run.find("purify");
if (found != string::npos)
{
cout << "Purifying DNA" << endl;
purify();
understood = true;
}
found = run.find("build");
if (found != string::npos)
{
cout << "Building overlaps" << endl;
buildOverlaps();
understood = true;
}
found = run.find("close");
if (found != string::npos)
{
cout << "Goodbye" << endl;
break;
}
if (understood == false) cout << "I'm sorry, I didn't understand you" << endl;
}
我从原来的方法移动了,如果string ==“string”则涉及到该方法,这样多条命令就可以由同一行执行。但是,当我运行这个新代码时,我得到了
Please enter command(s)
> run converter
(some long, nonzero, number)
I'm sorry, I didn't understand you
Please enter command(s)
> 0
Converting DNA
所以基本上,它似乎接受字符串,跳过if块(除了最后一个),然后回绕并执行适当的方法。这一切都有效,所以这只是一个小麻烦,但我想了解这种行为。
这些数字是找到的字符串索引的调试输出,在非测试执行中不存在。
答案 0 :(得分:2)
如果你的输入是
> run converter
然后你获得输入的方式
cin >> run;
不适用于你(operator>>
在空白处打破)。它第一次通过循环,它将尝试找到一个“运行”字符串,然后它将再次尝试找到一个“转换器”字符串。如果你想处理整行,你应该做
std::getline(std::cin, run);
答案 1 :(得分:0)
您应在每个continue;
块的末尾添加if(found != string::npos)
。
这样,如果它执行了块,它会跳过另一个块,如果阻塞并重新启动while
循环。