【问题标题】:Switch in infinite loop when my if statement finds a space in a string当我的 if 语句在字符串中找到空格时切换到无限循环
【发布时间】:2019-12-09 00:14:14
【问题描述】:

我正在尝试在 C++ 上进行猜字游戏。但是,每当我尝试添加带有空格的单词时,都不应该将其添加到单词库向量中。但是,当我添加一个单词时,它只是无限循环,让我们说“你好”。代码不完整,但我对它为什么无限循环感到困惑。

#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>
#include <cstring>

using namespace std;

void menu(vector<string> arr) {

    int menuInput;
    cout << "-----MENU-----\n";
    while(menuInput != 4){

        cout << "1. PLAY GAME\n";
        cout << "2. ADD A WORD\n";
        cout << "3. OUTPUT ALL AVAILABLE WORDS\n";
        cout << "4. QUIT\n";
        cout << "USER CHOICE:\n";
        cin >> menuInput;

        switch(menuInput) {

            case 1:
                break;
            case 2:
            {
                string addWord;
                cout << "ADD A WORD:\n";
                getline(cin, addWord);
                int n = addWord.length();
                bool finalAdd = true;

                char addWordArray[n];
                strcpy(addWordArray, addWord.c_str());

                int i;
                for(i = 0; i < n; i++) {

                    if(addWordArray[i] == ' ') {
                        finalAdd = false;
                    }
                }
                if(finalAdd == true) {

                    arr.push_back(addWord);
                    cout << "Word added!\n";
                } else {

                    cout << "Word not added, word had a space.\n";
                }
            }
                break;
            case 3:
                break;
            case 4:
                break;
        }
    }
}

int main() {

    vector<string> arr {"APPLE", "BANANA", "ORANGE", "PINEAPPLE"};
    menu(arr);
}

【问题讨论】:

标签: c++


【解决方案1】:

您不需要创建一个 char 数组然后将其复制过来。此外,每当您在使用 getline 之前执行 cin &gt;&gt; 时,您都需要执行 cin.ignore() 以刷新换行符。将开关的内部部分更改为:

            case 2:
            {
                string addWord = "";
                cout << "ADD A WORD:\n";
                cin.ignore();
                getline(cin, addWord);
                int n = addWord.length();
                bool finalAdd = true;

                int i;
                for(i = 0; i < n; i++) {

                    if(addWord[i] == ' ') {
                        finalAdd = false;
                    }
                }

还可以考虑初始化为 0,例如:

int menuInput = 0;

也许您想通过引用传递向量,以便在退出菜单功能后保留添加的单词,因为目前您正在通过值传递它。当您通过值传递时,您只是对函数内的对象进行更改,而不是更改存在于函数之外的对象。按值传递会生成对象的副本。这是一个如何纠正按值传递/复制向量的示例:

// the & symbol is used to pass by reference
void menu(vector<string>& arr)

【讨论】:

  • 非常感谢!我不知道 cin.ignore() 的用途,因为我来自 java。
【解决方案2】:

cin.ignore(),解决了这个问题。将 cin.ignore() 放在 cin >> menuInput; 之后。

参考:https://www.geeksforgeeks.org/clearing-the-input-buffer-in-cc/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多