Quit-опция и цикл while в C ++ - PullRequest
0 голосов
/ 08 мая 2018

В моем методе я хочу иметь возможность вводить строку строк, и она отфильтрует меня первое слово в качестве команды и другие слова в качестве параметров. Каждая строка начинается с символа «$».

Это должен быть непрерывный цикл, пока я не наберу "CTR_C". Если я наберу "CTR_C", меня спросят, хочу ли я выйти или нет. Если «y», я выйду из метода, если «n», то снова должен быть «$», и я смогу продолжать вводить строки строк.

Теперь в этой части, когда я наберу "n", я не вернусь к своему while (myLoop) -loop, и вместо этого меня выгонят из метода. Какую ошибку я упустил из виду?

int read_command(char *command, char *parameters[]) { // prompt for user input and read a command line 

// getline, extract command and parameters, set noParam, ...
// ...

int noParam = 0;
bool myLoop{true};
string myCommand{};
vector<string> paramVec{};
vector<string> words;

string line;
while (myLoop) {

    cout << "$ ";


    while (getline(cin, line)) {
        int test{};
        istringstream iss(line);
        string word;
        unsigned i = 0;

        while (iss >> word) {

            if (word != "CTR_C") {
                words.push_back(word);
                ++i;
                test++;
            } else {

                string yn{};

                cout << "Do you want to quit (y/n)?" << endl;

                cin >> yn;
                if (yn == "y") {
                    myLoop = false;
                    break;

                } else {
                    if (yn == "n") {
                        cout << "nicht abbrechen" << endl;
                        myLoop = true;
                        test = 999;


                    } else {
                        cout << "Eingabe ungueltig" << endl;
                        myLoop = true;
                        test = 999;

                    }
                }

            }

        }

        if (test == 0) {
            myLoop = false;
            break;
        } else {
            if (test == 999) {

                cout << "try again" << endl;
                myLoop = true;

            } else {

                //extract command
                myCommand = words.at(0);
                cout << "Command is: " << myCommand << endl;

                //extract parameters                
                for (int i = 1; i < words.size(); i++) {
                    paramVec.push_back(words.at(i));
                }
                cout << "Param is: ";
                for (int i = 0; i < paramVec.size(); i++) {
                    cout << paramVec.at(i) << endl;
                }

            }
        }

        break;

    }

}

return (noParam);

};

1 Ответ

0 голосов
/ 08 мая 2018

Вы должны добавить эти две строки перед инструкцией "test == 999"

            cin.clear();
            cin.ignore(10000, '\n');

Ваш код должен выглядеть так:

            if (test == 999) {
            cout << "try again" << endl;
            myLoop = true;
            cin.clear();
            cin.ignore(10000, '\n');
        }

Теперь это работает, и еще один совет, если вы используете следующее утверждение:

        if (test == 0) {
            //INSTRUCTION1
        }
        else if (test == 999) {
            //INSTRUCTION2
        }
        else {
            //INSTRUCTION3
        }

Не такой, как ты:

    if (test == 0) {
      //INSTRUCTION1
        }
        else {
            if (test == 999) {
         //INSTRUCTION2
            }
            else {
        //INSTRUCTION3
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...