Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: do{scanf("");}while();_____??!  (Прочитано 6905 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« : 16-05-2006 16:54 » 

Код:
struct MyMatrix
{
int MySize;
double Matrix[20][20];
}Massiv;

...

do
{
scanf("%i",&Massiv.MySize);


if((Massiv.MySize<1)||(Massiv.MySize>20))
printf("\nРазмер матрицы не может быть меньше 1 или больше 20\a");

printf("\n%i",Massiv.MySize);

}while((Massiv.MySize<1)||(Massiv.MySize>20));
При вводе 0.5 зацикльвается (как и должно), но ввода больше не запрашивает, а выдаёт:
Код:
Размер матрицы не может быть меньше 1 или больше 20
0
Размер матрицы не может быть меньше 1 или больше 20
0
Размер матрицы не может быть меньше 1 или больше 20
0
Размер матрицы не может быть меньше 1 или больше 20
0
Размер матрицы не может быть меньше 1 или больше 20
0
Размер матрицы не может быть меньше 1 или больше 20
0
Размер матрицы не может быть меньше 1 или больше 20
0
Размер матрицы не может быть меньше 1 или больше 20
0
Пока не <Ctrl>+<Break>
ПОЧЕМУ, У ... Не понял
Совершенно не понятно...
Для любопытных:
-Компилятор  BC++3.1(хотя в BC++ Builder 6 тоже самое...)
-System  Windows XP
Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #1 : 16-05-2006 18:02 » 

Запрашиваешь интегер, а вводишь флоат. Рушишь внутренние структуры функции scanf. Запрашивай уж тогда %f, и когда ввод будет не целочисленным также об этом выводи предупреждение.
Записан
Arct
Участник

ru
Offline Offline
Пол: Мужской
Злое


« Ответ #2 : 18-05-2006 03:04 » 

Я так понимаяю - раз приминяется спецификатор %i scanf должна считывать из  потока пока не встретится недопустимое значение, коим и является точка. Или я ошибаюсь?
Тогда почему возращаемое значение = 1, а не EOF Не понял
Код:

if((j=scanf("%i" ,&i))==EOF)
        printf("Error input\a");
printf("%i \n %i",i,j);
при вводе 0,5 выводит:
Код:
0
1
Получается считывает до точки?


Разве, что в цикле csanf пытается считать то, что осталось в потоке?

ЗЫ

Tuborg
Integer будет итеджер, а не итегер Улыбаюсь
« Последнее редактирование: 18-05-2006 03:21 от Arct » Записан

Пройди свой путь, ты не сумеешь назад всё вернуть...
Tuborg
Команда клуба

ee
Offline Offline

« Ответ #3 : 18-05-2006 10:32 » new

scanf ни зачем не следит, он просто делает. Попробуй также вывести одним printf'ом 4ре long'а - сильно удивишься результату =)...

Меняй %i на подобающее и сам следи за форматом ввода. Scanf этого не умеет.
« Последнее редактирование: 19-12-2007 18:26 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines