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

Ввод данных в консоль - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
surfrider
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 4
08.11.2009, 20:48     Ввод данных в консоль #1
Пишу консольное приложение в Visual Studio 2008 на C++. такая проблема:

C++
1
2
3
4
5
6
    while((timerDelay<0)||(timerDelay>20000))
    {
        scanf("%d", &timerDelay);
        if ((timerDelay<0)||(timerDelay>20000))
             printf(text2); //сообщение об ошибке
    }
Надо так: я ввожу данные, если они не удовлетворяют условию, то прога пишет "ошибка" и предлагает ввести данные снова.

На деле выходит так: если я ввожу цифру от 0 до 20000 то все работает, прога выполняется дальше.
Если ввожу цифры вне диапазона, то все работает, прога выводит ошибку и предлагает ввести заново.

Но если я введу мусор, например, букву, то указанный цикл будет выполняться бесконечно, причем БЕЗ ввода! т.е. будет бесконечно выполняться printf(text2);, а scanf("%d", &timerDelay); выполняться не будет, будто бы я уже ввел данные.

в чем дело?

p.s. fgets тоже пробовал, работает, но если ввести мусор и цифру 0, то результаты atoi будут одинаковыми, errno не катит. да и все равно хочу через сканф или син сделать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
08.11.2009, 20:53     Ввод данных в консоль #2
surfrider, очищай буффер ввода. Скорее всего там муссор остается.
Iworb
анимешник++
 Аватар для Iworb
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 411
08.11.2009, 21:02     Ввод данных в консоль #3
C
1
2
3
4
5
6
7
8
9
 while((timerDelay<0)||(timerDelay>20000))
        {
                error:
                scanf("%d", &timerDelay);
                if ((timerDelay<0)||(timerDelay>20000))
                    { printf(text2); //сообщение об ошибке
                      goto error;
                      }
        }
а так?
surfrider
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 4
08.11.2009, 21:13  [ТС]     Ввод данных в консоль #4
Monte-Cristo, я уже думал об этом, но я понятия не имею, где этот буфер и как его чистить. не подскажешь?


Iworb, нет, не заработало. все крутится во внутреннем цикле (переход в error)
Iworb
анимешник++
 Аватар для Iworb
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 411
08.11.2009, 21:18     Ввод данных в консоль #5
C
1
2
3
4
5
6
7
8
9
error:
 while((timerDelay<0)||(timerDelay>20000))
        {
                scanf("%d", &timerDelay);
                if ((timerDelay<0)||(timerDelay>20000))
                    { printf(text2); //сообщение об ошибке
                      goto error;
                      }
        }
тогда так

Добавлено через 1 минуту
хотя......... не уверен

Добавлено через 52 секунды
а каким типом у тебя объявлена переменная timerDelay? Объяви ее как unsigned int

Добавлено через 42 секунды
может что-то и получится.... правда тоже не уверен....
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
08.11.2009, 21:33     Ввод данных в консоль #6
C
1
2
3
4
5
6
7
8
9
        int a=1;
        while(((timerDelay<0)||(timerDelay>20000)) && a==1)
        {
               
                a=scanf("%d", &timerDelay);
                if (((timerDelay<0)||(timerDelay>20000))&&a==1)
                     printf(text2); //ñîîáùåГ*ГЁГҐ îá îøèáêå
                    
        }
surfrider
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 4
08.11.2009, 21:34  [ТС]     Ввод данных в консоль #7
Iworb, снова не работает. все-таки мне кажется, что надо где-то очищать буфер клавиатуры, но, блин, как это сделать? яндекс какую-то чушь выдает.
Iworb
анимешник++
 Аватар для Iworb
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 411
08.11.2009, 21:39     Ввод данных в консоль #8
Цитата Сообщение от valeriikozlov Посмотреть сообщение
C
1
2
3
4
5
6
7
8
9
        int a=1;
        while(((timerDelay<0)||(timerDelay>20000)) && a==1)
        {
               
                a=scanf("%d", &timerDelay);
                if (((timerDelay<0)||(timerDelay>20000))&&a==1)
                     printf(text2); //ñîîáùåГ*ГЁГҐ îá îøèáêå
                    
        }
интересненько.... никогда бы о таком не подумал))
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
08.11.2009, 21:40     Ввод данных в консоль #9
Цитата Сообщение от surfrider Посмотреть сообщение
Monte-Cristo, я уже думал об этом, но я понятия не имею, где этот буфер и как его чистить. не подскажешь?
Через fflush()

C
1
2
3
4
5
6
7
8
        while((timerDelay<0)||(timerDelay>20000))
        {
                scanf("%d", &timerDelay);
                if ((timerDelay<0)||(timerDelay>20000))
                     printf(text2); //сообщение об ошибке
                fflush(stdin);
                
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2009, 21:57     Ввод данных в консоль
Еще ссылки по теме:

C++ Ввод чисел в консоль и их вывод в порядке возрастания
C++ Ввод/вывод в консоль любой произвольной информации и закрытие ее после прочтения
Ввод в строки и вывод в консоль кириллицы C++
C++ Ввод в консоль только цифр
C++ Ввод матрицы из файла и вывод на консоль

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

Или воспользуйтесь поиском по форуму:
surfrider
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 4
08.11.2009, 21:57  [ТС]     Ввод данных в консоль #10
valeriikozlov, не работает. я там потом еще исправил кое-что ( не && a==1, надо || a==0, ведь в переменной a у нас хранится число переведенных полей, и должно выполняться любое из условий, чтобы еще по диапазону срабатывало), тогда то же самое: во второй и следующие разы прохода цикла строка a=scanf("%d", &timerDelay); "не выполняется". точнее, выполняется, но без моего участия.

Добавлено через 4 минуты
Monte-Cristo, то, что надо! спасибо! вроде работает! надо погонять еще. но, кажется, оно.

спасибо всем отписавшимся!
Yandex
Объявления
08.11.2009, 21:57     Ввод данных в консоль
Ответ Создать тему
Опции темы

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