【问题标题】:While loop uses the same value each timeWhile 循环每次使用相同的值
【发布时间】:2015-08-02 00:58:00
【问题描述】:

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

例如: 选择=一个; 所以我永远无法改变它,因为循环不起作用。 如果选择 = 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();// закрываю файл 
        }

    }
}

【问题讨论】:

  • 请将其设为SSCCE
  • @RichardCritten 我知道,我看到我只输入一次选择,但每次都应该。我无法理解。我只是需要一些帮助,伙计们..
  • @NathanOliver 我会的,这是我的第一篇文章。

标签: c++ validation input while-loop iostream


【解决方案1】:

choice 是一个int。当您执行cin&gt;&gt;choice 并且用户输入非数值时,故障位设置为cin。该位也会使所有后续输入失败,直到您使用 cin.clear() 清除标志并使用 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); 
}

【讨论】:

  • 我明白了,谢谢。我应该使用 cin.clear() 之类的东西还是应该如何忽略错误的输入?
  • 两者都有!给我10分钟。我回到家,可以使用真正的键盘来接听;-)
  • @whoiskatrin 已编辑:您有函数参考的链接,以及如何进行错误处理的示例,重新询问用户,直到他给出正确或结束输入。
  • 哦,谢谢。我不知道 cin.ignore()。现在我明白了,我可以问吗?什么是“cerr”和 cin.eof()?
  • cerr 类似于cout,但它仅用于显示错误。 cin.eof() 告诉在最后一次尝试读取输入期间是否遇到文件结尾。
【解决方案2】:

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

 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 
 }

【讨论】:

  • 如果你想要一个常量迭代器,使用 cbegin() 和 cend()。 (我已编辑)
猜你喜欢
  • 2013-02-06
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
相关资源
最近更新 更多