CRACKL@B Оригинальный DVD-ROM крэкера: CRACKL@B DVD !
Домой | Статьи | RAR-cтатьи | Форум | Программирование | Скачать | DVD-ROM
Новичку | FAQ | Ссылки | Интервью | Архив | Новости | Связь


Русский / Russian English / Английский

Сейчас на форуме: RaMMicHaeL, Ara, gudvin2, gorelkin (+7 невидимых пользователей)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 CRACKL@B —› Оффтоп —› Помогите с С/C++! (важно)
Посл.ответ Сообщение
Oott


Ранг: 65.9 (постоянный)
Статус: Участник

Создано: 14 февраля 2008 20:39:03 · Поправил: Oott
Личное сообщение #1

Вобщем такая задача, сделать ввод целого числа через scanf и что бы пользователь не вбил, должен быть вразумительный ответ от программы. Толи из-за глюченого компиля, толи еще из-за чего у меня не выходит сделать, чтобы прога не валилась при вводе букв!
Вот мой код:
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
void main()
{
int pr;
double m;
while(1)
{clrscr();
pr=0;
printf("Vvedite celie chisla m:\n");
scanf("%lf",&m);
if(int(m)==0)
{ printf("Error_(m):Vi vveli ne chislennii simvol, vvedite chislo!\n"); pr=1;}
if(m!=int(m))
{ printf("Error_(m):Vi vveli ne celoe chislo, vvedite celoe!\n"); pr=1;}
if(pr==0)
{break;}
getch(); }
printf("chislo %d",int(m));
getch();
}
Пожалуйсто помогите, очень нужно!
Player

Ранг: 20.8 (новичок)
Статус: Участник

Создано: 14 февраля 2008 21:34:53 · Поправил: Player
Личное сообщение #2

Ппроблема в том, что Вы не очищаете входной буфер после неправильного ввода.
Когда scanf натыкается на символ не соответсвующий формату - чтение прекращается, и символы остаются во входном потоке.
В результате прога зацикливается, читая одни и те же символы.
В общем, после обнаружения неправильного ввода необходимо очищать входной поток:
fflush(stdin)
Но это не стандартный способ (не везде работает).
Лучше читать строку, введенную пользователем, с помощью fgets, а потом разбирать её с помощью sscanf
Oott


Ранг: 65.9 (постоянный)
Статус: Участник

Создано: 14 февраля 2008 21:51:33
Личное сообщение #3

Большое спасибо за разьяснение ошибки. Ну вот только число после ввода буквы будет всегда равно нулю и как теперь отличит его программе от реального нуля?
Player

Ранг: 20.8 (новичок)
Статус: Участник

Создано: 14 февраля 2008 21:54:50
Личное сообщение #4

Надо анализировать возвращаемое значение scanf.
Оно равно числу успешно распознанных полей.
Например:
if(scanf("%lf",&m) != 1)
// Здесь scanf не смог преобразовать ввод пользователя
Oott


Ранг: 65.9 (постоянный)
Статус: Участник

Создано: 14 февраля 2008 22:02:48
Личное сообщение #5

Еще раз большое спасибо, реально помог!
 CRACKL@B —› Оффтоп —› Помогите с С/C++! (важно)

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0

    Для печати 


Оригинальный DVD-ROM крэкера: CRACKL@B DVD !


Вы находитесь на форуме сайта CRACKLAB.RU
Проект ReactOS