Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2016, 23:21   #1
Alexey!
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 18
По умолчанию Не выполняется scanf

Здравствуйте.

MS VC2005, WinXP

В приведенном коде при вводе на первый запрос нечислового значения, например буквы, не выполняется последующий запрос scanf ввода значения BBB. В чем проблема?
Заранее благодарю за ответ!

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <conio.h>

unsigned short AAA, BBB;
int c;//промежут. переменная для ввода значений

void main()
{
setlocale(LC_CTYPE, "rus");

printf_s("Введите AAA в диапазоне 0-7\n");
scanf_s("%u", &c);
while (c>7 || c<0)
{printf_s("Введенное значение AAA не в диапазоне 0-7\n");
scanf_s("%u", &c);}
AAA=c;

printf_s("Введите BBB в диапазоне 0-7\n");
scanf_s("%u", &c);
while (c>7 || c<0)
{printf_s("Введенное значение BBB не в диапазоне 0-7\n");
scanf_s("%u", &c);}
BBB=c;
}
Alexey! вне форума Ответить с цитированием
Старый 19.03.2016, 23:54   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

если не число ввести, то в c ничего не будет присвоено и останется предыдущее значение (скорее всего 0 в данном случае, ибо глобальная переменная).

Чтобы узнать об ошибке ввода можно прочитать документацию по scanf и проверять возвращаемое значение. http://www.cplusplus.com/reference/cstdio/scanf/
Только тогда вам для повтора ввода наверно надо stdin очистить, иначе оно так и будет пытаться букву прочитать. Например что-то типа
Код:
while (getchar() != '\n');
или
Код:
fflush(stdin);
(второе вроде не определено стандартом и может работать не везде)

Цитата:
MS VC2005, WinXP
Как там вам в 2005 году живется?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 19.03.2016 в 23:56.
Alex11223 вне форума Ответить с цитированием
Старый 20.03.2016, 19:50   #3
Alexey!
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 18
По умолчанию

Уважаемый Alex11223!
Благодарю за помощь. Т.е. при некорректном завершении функции scanf портится поток ввода и в следующем запросе scanf не отрабатывает? Можно ли очистить поток средствами С (т.е. не используя функции C++)? Или это в С нерешаемо? Тогда как в С решается задача обеспечения корректности вводимых данных?
Alexey! вне форума Ответить с цитированием
Старый 20.03.2016, 19:58   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Он не портится, просто в нем остается та буква (если пытались прочитать число).

Так оба варианта выше вроде и используют только то, что есть в С.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 20.03.2016 в 20:02.
Alex11223 вне форума Ответить с цитированием
Старый 21.03.2016, 10:26   #5
Alexey!
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 18
По умолчанию

Благодарю за помощь!
Alexey! вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
%ls и %lc в printf и scanf Krasiosoft Помощь студентам 2 08.07.2015 22:30
scanf cocacola Общие вопросы C/C++ 1 10.07.2014 05:09
scanf zla9_kolu4ka Общие вопросы C/C++ 2 26.03.2014 21:48
scanf intmain Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 25 20.02.2013 17:53
scanf и матрица Berlioz Общие вопросы C/C++ 4 24.09.2012 15:12