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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
surfrider
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 4
#1

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

08.11.2009, 20:48. Просмотров 2912. Ответов 9
Метки нет (Все метки)

Пишу консольное приложение в 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 не катит. да и все равно хочу через сканф или син сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2009, 20:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ввод данных в консоль (C++):

Ввод данных в консоль - C++
Если я хочу ввести одну переменную в консоль, то чтобы ввести другую переменную, мне обязательно нужно нажать Enter. Есть ли возможность...

Ввод функции через консоль - C++
Добрый день, уважаемые программисты! Я недавно начал изучать программирование и походу изучения у меня в голове возникла нестандартная ,...

Ввод в консоль только цифр - C++
Есть функция ввода ответа, как сделать чтобы пользователь мог вводить только цифры от 1 до 5, а если введел что либо другое то программа...

Кодировки, вывод/ввод на консоль и в файл - C++
Помогите разобраться с кодировками, а то я в этом вопросе не очень разбираюсь. Не получается одновременно сделать правильный ввод и вывод в...

Ввод/вывод кириллицы через консоль - C++
Вот простейший пример ввода и вывода слова(символа) через консоль # include &lt;iostream&gt; # include &lt;locale&gt; using namespace std; ...

Многократный ввод класса через консоль - C++
Подскажите пожалуйста! Есть класс Dot. Этот класс содержит координаты точки треугольника. Как можно сделать что бы при исполнении...

9
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
08.11.2009, 20:53 #2
surfrider, очищай буффер ввода. Скорее всего там муссор остается.
1
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
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;
                      }
        }
а так?
1
surfrider
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 4
08.11.2009, 21:13  [ТС] #4
Monte-Cristo, я уже думал об этом, но я понятия не имею, где этот буфер и как его чистить. не подскажешь?


Iworb, нет, не заработало. все крутится во внутреннем цикле (переход в error)
0
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
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 секунды
может что-то и получится.... правда тоже не уверен....
1
valeriikozlov
Эксперт С++
4670 / 2496 / 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); //ñîîáùåГ*ГЁГҐ îá îøèáêå
                    
        }
2
surfrider
0 / 0 / 0
Регистрация: 08.11.2009
Сообщений: 4
08.11.2009, 21:34  [ТС] #7
Iworb, снова не работает. все-таки мне кажется, что надо где-то очищать буфер клавиатуры, но, блин, как это сделать? яндекс какую-то чушь выдает.
0
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
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); //ñîîáùåГ*ГЁГҐ îá îøèáêå
                    
        }
интересненько.... никогда бы о таком не подумал))
0
Monte-Cristo
2789 / 1375 / 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);
                
        }
1
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, то, что надо! спасибо! вроде работает! надо погонять еще. но, кажется, оно.

спасибо всем отписавшимся!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.11.2009, 21:57
Привет! Вот еще темы с ответами:

Как осуществить неограниченный ввод в консоль? - C++
Необходимо вводить в консоль случайное количество чисел разделенные пробелом, например: 2 10 11 9 Как это осуществить? Обычный cin не...

Ввод в строки и вывод в консоль кириллицы - C++
Есть программа для подсчета количества букв в введенной строке,но если вводить строку на Русском языке выводит непонятные символы,но если...

Ввод вывод в файл и консоль.(Кириллица) - C++
int main() { setlocale(LC_ALL, &quot;rus&quot;); ifstream a(&quot;qwe.txt&quot;); string x, y; getline(cin, x); //1- ввод из консоли в (x) ...

Ввод матрицы из файла и вывод на консоль - C++
Подскажите, в чем проблема. Данные для матрицы берем из файла, а выводим ее на консоль. Вроде все правильно написала, помогите найти...


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

Или воспользуйтесь поиском по форуму:
10
Yandex
Объявления
08.11.2009, 21:57
Ответ Создать тему
Опции темы

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