Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ While循环每次使用相同的值_C++_Validation_Input_While Loop_Iostream - Fatal编程技术网

C++ While循环每次使用相同的值

C++ While循环每次使用相同的值,c++,validation,input,while-loop,iostream,C++,Validation,Input,While Loop,Iostream,我的代码有问题。有一个while循环,当一个enter不是一个数字,例如字符数据时,那么这个循环每次都使用相同的选择值。 这是一个列表,用户应该在其中选择一个变体。选择这是用户的选择。应该只有整数值,我对字符有问题 例如: 选择=a; 所以我不能改变它,因为循环不起作用。 若choice=2,它运行良好,我可以在循环运行时更改选项 int main() { setlocale(LC_ALL, "Russian"); string fname; Data object;

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

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

    }
}
intmain()
{
setlocale(法语,俄语);
字符串fname;
数据对象;
做
{
std::cout fname;

out
选项
是一个
int
选项。当您选择
cin>
并且用户输入一个非数字值时,failbit设置为
cin
。该位也将使所有后续输入失败,直到您用清除标志并用忽略错误的输入

例如:

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); 
}
while((cin>>choice).fail()&&&!cin.eof()){//如果失败,但不是eof

cout可能对某些人有用。如果要检查输入字符串是否只有数值,可以通过以下方式执行:

 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 
 }
bool是数字(常量字符串和str)
{
auto it=str.cbegin();
而(it!=str.cend()&&isdigit(*it))++it;
return!str.empty()&&it==str.cend();
}
字符串选择;
...
cin>>选择;
如果(!是_编号(选项)){

我知道,我只输入了一次选择,但每次都应该。我不明白。我只是需要一些帮助,伙计们。@NathanOliver我会的,这是我的第一篇帖子。我明白了,谢谢。我应该使用类似cin.clear()的东西吗或者我应该如何忽略错误的输入?两者都有!给我10分钟。我回家了,可以用一个真正的键盘来回答;-)@whoiskatrin编辑:你有函数引用的链接,还有一个示例如何进行错误处理,重新搜索用户,直到他给出正确的答案或结束输入。哦,谢谢。我不知道cin。我知道gnore()。现在我明白了,我可以问一下吗?什么是“cerr”和cin.eof()?
cerr
类似于
cout
,但它只用于显示错误。cin.eof()告诉您在上次尝试读取输入时是否遇到了文件结尾。如果您想要一个常量迭代器,请使用cbegin()和cend()