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 一起触发?

【问题讨论】:

默认情况下&gt;&gt; 只会读取直到遇到空格。如果你想读一行,你应该使用std::getline @RetiredNinja 感谢您的回复。 getline(cin, question) 有效,但有没有办法单独使用 cin &gt;&gt; 呢? 最好使用正确的工具来完成工作,而不是试图让错误的工具发挥作用。当你这样做时,你会遇到这样的问题:***.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&gt;&gt;更合适的功能。

以上是关于while循环对C++中字符串中的每个单词重复的主要内容,如果未能解决你的问题,请参考以下文章

迭代一行中的每个单词(字符串)c ++

C++ While循环不重新分配字符串值

为啥这个while循环在输入的每个字符之后重复?

C ++,cin,直到不再使用while循环在线输入

使用 for 循环重复字符串

使用 C++,尝试使用 for 循环和 std::max 查找向量中的最大单词