while 循环每次使用相同的值

While loop uses the same value each time

我的代码有问题。有 while 循环,当输入的不是数字,例如字符数据时,那么这个循环每次都使用相同的选择值。 这是一个列表,用户应该在其中选择一个变体。选择是用户的选择。应该只有整数值,我对字符有问题。

例如: 选择=一个; 所以我永远无法更改它,因为循环不起作用。 如果 choice = 2,效果很好,我可以在循环工作时更改选择。

int main()
{

    setlocale(LC_ALL, "Russian");
    string fname;
    Data object;
    do
    {
        std::cout << "Введите имя файла: ";
        out << "Введите имя файла: ";
        cin >> fname;
        out << fname;
        object.CreateAndRecordToFile(fname);
    }
    while (nameisright == false);


    std::cout << "Создан файл для записи " << object.ffullname << endl;
    out.open(object.ffullname, ofstream::out);// открываю созданный файл и говорю, что хочу в него записывать


    int ch1, ch2;
    bool prov = true;
    int choice;

    while (prov)
    {

        std::cout << "Выберите, пожалуйста, метод решения СЛАУ:" << endl;
        out << "Выберите, пожалуйста, метод решения СЛАУ:";
        std::cout << "1. Метод Гаусса \n";
        out << "1. Метод Гаусса \n";
        std::cout << "2. Метод LU разложения\n";
        out << "2. Метод LU разложения\n";
        std::cout << "3. Выход\n";
        out << "3. Выход\n";
        std::cout << "Ваш выбор: ";
        out << "Ваш выбор: ";
        cin >> choice;
        //char ccc[200];
        //cin >> ccc;
        /*while (false){
            if (strlen(ccc) != 0){
            for (int i = 0; i < strlen(ccc); i++) {
            if (!isdigit(ccc[1])){
            std::cout << ccc[i] << " is not numeric.\n";
            return false;
            }
            }
            }
            }*/

        //else

        //choice = stoi(ccc);

        //out << ccc;
        //check(choice);
        switch (choice)
        {
        case 1:            // Гаусс 
        {


            std::cout << "Выберите, пожалуйста, метод ввода данных:" << endl;
            out << "Выберите, пожалуйста, метод ввода данных: ";
            std::cout << "1. Ввод данных с клавиатуры \n";
            out << "1. Ввод данных с клавиатуры  \n";
            std::cout << "2. Ввод данных из файла \n";
            out << "2. Ввод данных из файла\n";
            std::cout << "3. Выход\n";
            out << "3. Выход\n";
            std::cout << "Ваш выбор: ";
            out << "Ваш выбор: ";
            cin >> ch1;
            out << ch1;
            switch (ch1)
            {
            case 1:
                object.Size();
                object.Init();
                object.MatrixInPut();
                object.InitAndInputVector();
                object.printAll();
                object.GaussElimination();
                object.printResultGauss();
                break;
            case 2:
                object.ReadingSize();
                object.Init();
                object.ReadingMatrixFromFile();
                object.ReadingVectorFromFile();
                object.printAll();
                object.GaussElimination();
                object.printResultGauss();

                break;
            case 3:            // Просто прощайте
                std::cout << endl;
                out << endl;
                std::cout << "Спасибо, что были с нами!\n";
                out << "Спасибо, что были с нами!\n";
                prov = false;
                break;
            default:            // На случай фейлов
                std::cout << endl;
                out << endl;
                std::cout << "Ошибка, некорректный ввод, повторите ввод.\n";
                out << "Ошибка, некорректный ввод, повторите ввод.\n";
                break;
            }

            break;
        case 2:            // ЛУ

        {


            std::cout << "Выберите, пожалуйста, метод ввода данных:" << endl;
            out << "Выберите, пожалуйста, метод ввода данных: ";
            std::cout << "1. Ввод данных с клавиатуры \n";
            out << "1. Ввод данных с клавиатуры  \n";
            std::cout << "2. Ввод данных из файла \n";
            out << "2. Ввод данных из файла\n";
            std::cout << "3. Выход\n";
            out << "3. Выход\n";
            std::cout << "Ваш выбор: ";
            out << "Ваш выбор: ";
            cin >> ch2;
            out << ch2;
            switch (ch2)
            {
            case 1:
                object.Size();
                object.Init();
                object.MatrixInPut();
                object.printMatrix();
                object.LUdecomposition();
                object.printLU();
                break;
            case 2:
                object.ReadingSize();
                object.Init();
                object.ReadingMatrixFromFile();
                object.printMatrix();
                object.LUdecomposition();
                object.printLU();
                break;
            case 3:            // Просто прощайте
                std::cout << endl;
                out << endl;
                std::cout << "Спасибо, что были с нами!\n";
                out << "Спасибо, что были с нами!\n";
                prov = false;
                break;
            default:            // На случай фейлов
                std::cout << endl;
                out << endl;
                std::cout << "Ошибка, некорректный ввод, повторите ввод.\n";
                out << "Ошибка, некорректный ввод, повторите ввод.\n";
                break;


            }
            break;
        case 3:            // Просто прощайте
            std::cout << endl;
            out << endl;
            std::cout << "Спасибо, что были с нами!\n";
            out << "Спасибо, что были с нами!\n";
            prov = false;
            break;
        default:            // На случай фейлов
            std::cout << endl;
            out << endl;
            std::cout << "Ошибка, некорректный ввод, повторите ввод.\n";
            out << "Ошибка, некорректный ввод, повторите ввод.\n";
            //choice = 0;
            //prov = false;


        }
        }
        out.close();// закрываю файл 
        }

    }
}

choice 是一个 int。当您执行 cin>>choice 并且用户输入非数字值时,将为 cin 设置 failbit。该位也会使所有后续输入失败,直到您使用 cin.clear() and ignore the wrong input with cin.ignore() 清除标志。

示例:

while ((cin>>choice).fail() && !cin.eof()) {  // if failed but not eof
    cout<<"Enter numeric data ! Please retry... ";
    cin.clear();                  // clear error state
    cin.ignore(INT_MAX,'\n');     // ignore everything until then end of the line
}
if (cin.eof()) {
    cerr << "FATAL ERROR: unexpected end of file"<<endl; 
    exit(1); 
}

也许对某些人有用。如果你想检查输入的字符串是否只有数值,你可以这样做:

 bool is_number(const string& str)
 {
      auto it = str.cbegin();
      while (it != str.cend() && isdigit(*it)) ++it;
      return !str.empty() && it == str.cend();
 }


 string choice;
 ...
 cin >> choice; 
 if (!is_number(choice)) {
        cout << "Enter numeric data ! Please retry." << endl;
        cin.clear();                   
 }
 else {
       // process the number 
 }