while循环对C++中字符串中的每个单词重复
Posted
技术标签:
【中文标题】while循环对C++中字符串中的每个单词重复【英文标题】:While loop repeats for every word in a string in C++ 【发布时间】:2022-01-05 10:54:00 【问题描述】:我正在尝试制作一个魔术 8 球,它为除“再见”之外的任何输入提供随机预设答案。每次调用 void 函数 magic8ball() 时,它都会生成一个 0 - 19 的随机数,并在控制台打印相应的响应。
int main()
string question;
cin >> question;
while (question != "bye")
magic8ball();
cout << "~Ask another question.\n";
cin >> question;
return 0;
由于某种原因,如果问题的输入有多个单词/字符之间有空格,则循环会在再次询问输入之前对每个单词重复。我坚持了一个“cout
>hi frend
... Ask again later
hi
~Ask another question.
... Don't count on it
frend
~Ask another question.
如何防止 while 循环将字符串视为一系列单词?为什么 cin 不与 magic8ball() 和 cout 一起触发?
【问题讨论】:
默认情况下>>
只会读取直到遇到空格。如果你想读一行,你应该使用std::getline
。
@RetiredNinja 感谢您的回复。 getline(cin, question)
有效,但有没有办法单独使用 cin >>
呢?
最好使用正确的工具来完成工作,而不是试图让错误的工具发挥作用。当你这样做时,你会遇到这样的问题:***.com/questions/10946771/effect-of-noskipws-on-cin 和这个:***.com/questions/21809838/…
【参考方案1】:
std::cin
在看到空格时停止读取。空格也算作空格。
如果您希望字符串有空格,请使用std::getline()
int main()
string question;
std::getline(std::cin, question);
while (question != "bye")
magic8ball();
cout << "~Ask another question.\n";
std::getline(std::cin, question);
return 0;
【讨论】:
有没有办法使用cin
并在字符串被 while 循环读取之前删除或忽略字符串中的空格?
@FredrickVonHumperdinger 是的,有办法。但为什么? std::getline()
是适合这项工作的工具。
std::getline(std::cin, question);
仍在“使用cin
”。它只是使用了比operator>>
更合适的功能。以上是关于while循环对C++中字符串中的每个单词重复的主要内容,如果未能解决你的问题,请参考以下文章