Форум программистов, компьютерный форум CyberForum.ru

Корректный ввод данных, goodbit,зацикливание - C++

Восстановить пароль Регистрация
 
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.03.2012, 14:21     Корректный ввод данных, goodbit,зацикливание #1
Всем привет!
У меня вопрос следующего характера. Не понятно почему происходит зацикливание в следующем коде если за комментировать строчку №20 и рас комментировать строчку №23 :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<iostream>
#include<fstream>
 
int main(void)
{
    setlocale(LC_ALL,"Russian_Russia.1251");//коректное отображение Русского языка
    int itemp;//для ввода числа
    std::cin.unsetf(std::ios::skipws);//не игнорировать пробелы при вводе
    while(true)
    {
        std::cout<<"Введите число :";
        std::cin>>itemp;
        if(std::cin.good())
        {
            std::cout<<"Данные коректны!\n";
            std::cin.ignore(100,'\n');//очистить входной поток
            break;
        }
        std::cin.clear();//сброс failbit
        std::cout<<"Ошибка, данные не коректны!\n";
        std::cin.ignore(100,'\n');//очистить входной поток
                //std::cin.clear();//сброс failbit
 
    }
 
    system("Pause");
return 0;
}
В чём собственно разница, почему так происходит?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2012, 14:21     Корректный ввод данных, goodbit,зацикливание
Посмотрите здесь:

C++ ввод данных, добавление данных, получение информации из файла по заданным критериям выборки
C++ Каким образом организовывать ввод данных для поддержки программной обработка неправильно введенных данных?
C++ Корректный ввод структуры и ее обработка
C++ Зацикливание программы при вводе некорректных данных
C++ Проверка на корректный ввод. Выходит из цикла раньше времени
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.03.2012, 15:29     Корректный ввод данных, goodbit,зацикливание #2
если поток не гуд извлекаться из потока ничего не будет
stawerfar
 Аватар для stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.03.2012, 15:39  [ТС]     Корректный ввод данных, goodbit,зацикливание #3
Спасибо!!
PashaShulga
1 / 1 / 0
Регистрация: 15.06.2010
Сообщений: 37
30.03.2013, 16:37     Корректный ввод данных, goodbit,зацикливание #4
Есть кусок кода, мне нужно сделать так, чтобы программа не реагировала на любые другие символы кроме цифр 1-9.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int cell;
 
    cin>> cell; // указывает номер ячейки
    cout<<endl;
    
    while (cell >= 9 || cell <= 1 || cells[cell-1] == 'O' || cells[cell-1] == 'X') { 
       cout << "Вы выбрали уже занятую ячейку, выберете пустую клетку: ";
       cin >> cell;
       cout << "\n";
    }
    
   if (num == 1) cells[cell-1] = 'X';
      else cells[cell-1] = 'O';
}
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11828 / 6807 / 769
Регистрация: 27.09.2012
Сообщений: 16,878
Записей в блоге: 2
Завершенные тесты: 1
30.03.2013, 23:06     Корректный ввод данных, goodbit,зацикливание #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
int InputSize(const int min,const int max){
    int x;
    std::cout<<"Please, enter size ["<<min<<","<<max<<"] ->";
    bool ErrorFlag;
    do{
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
        std::cin>>x;
        ErrorFlag=!std::cin.good() || x>max || x<min;
        if(ErrorFlag){
            std::cout<<"Error. Enter size ["<<min<<","<<max<<"] ->"<<std::endl;
        }
    }while(ErrorFlag);
    std::cin.ignore(std::cin.rdbuf()->in_avail());
    return x;
}
int main(){
    InputSize(1,9);
}
Pepsy
47 / 32 / 4
Регистрация: 05.01.2013
Сообщений: 307
30.03.2013, 23:34     Корректный ввод данных, goodbit,зацикливание #6
Для красоты можно было после
C++
1
#include
вставить
C++
1
using namespace std;
и не использовать std:: каждую строку)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 23:39     Корректный ввод данных, goodbit,зацикливание #7

Не по теме:

Цитата Сообщение от Pepsy Посмотреть сообщение
Для красоты можно было после
C++
1
#include
вставить
C++
1
using namespace std;
и не использовать std:: каждую строку)
Здесь такого не пишите... Заклюют...



Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
//Вводятся только числа.
 
#include "conio.h" // для getch().
#include <iostream>
#include <string>
#include <sstream> // для stringstream.
using namespace std;
 
int main()
{
  int n = 0, flgS = 0, c = 0, q = 0; 
  unsigned char k = 'a'; // переменная для ввода.
  string str;      // строка для цифр и минуса.
 
 
   
    while (k != '|')
   {
        k = getch(); // ввод без отображения.
        if (k == '|') break;
        
        if ((k == '-') && (c == 0) && (flgS == 0)) // если символ минус, и число символов 0, 
                                                   //и минус ни разу не отображался (флаг 0).
       {
          flgS=-1; // если отображается минус.
          cout << '-';      // отображаем минус.
          str.push_back(k); // минус помещаем в строку.
          c++;              // число символов.
       }
        
        if ((k >= '0') && (k <= '9')) // если символ цифра.
       {
           cout << k;        // отображаем цифру.
           str.push_back(k); // символ в строку.
           c++;              // число символов.
           q++;              // число цифр.
       }
     
       if (k == '\b' && c != 0) // если backspace и число символов не 0.
       {
           cout << '\b'; // курсор на шаг назад.
           cout << ' ';  // затираем последий символ.
           cout << '\b'; // курсор на шаг назад.
           if (!str.empty()) // если строка не пуста, 
              str.pop_back(); // то извлекаем один.
           q--;            // число цифр уменьшили.
           if (q < 0) q = 0; // если получили отрицательное значение, то делаем 0. 
           c--;            // число символов уменьшили.
           if (c <= 0)     // если удалённый символ был последним,
           {
                flgS = 0; // обнуляем флаг, чтобы можно было снова отображать минус.
                c = 0;    // количество символов 0.
           } 
       }
 
       if ((k == 13) && (c != 0) && (q != 0)) break; // если, хотя бы, одна цифра введена, то выход. 
 
    }
    stringstream stream(stringstream::in | stringstream::out); // создаётся объект для внутреннего форматирования.
    stream << str; // вводим строку числовых символов.
    stream >> n;   // извлекаем число.
    cout << endl << n << endl;
 
 system("pause");
 return 0;  
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 23:48     Корректный ввод данных, goodbit,зацикливание
Еще ссылки по теме:

Корректный ввод с cin C++
Не корректный вывод данных C++
C++ Как организовать корректный ввод?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
30.03.2013, 23:48     Корректный ввод данных, goodbit,зацикливание
  #8

Не по теме:

Цитата Сообщение от Pepsy Посмотреть сообщение
Для красоты можно было после
Да Вы эстет
А вообще
C++
1
using namespace std;
лично я считаю уродством

Добавлено через 49 секунд
Цитата Сообщение от alsav22 Посмотреть сообщение
Здесь такого не пишите... Заклюют...
В точку

Yandex
Объявления
30.03.2013, 23:48     Корректный ввод данных, goodbit,зацикливание
Ответ Создать тему
Опции темы

Текущее время: 22:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru