Сейчас на форуме: asfa, cyberlabs, Vicshann (+7 невидимых)

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


Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

Создано: 14 февраля 2008 20:39 · Поправил: 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();
}
Пожалуйсто помогите, очень нужно!



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

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

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




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

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

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



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

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

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




Ранг: 106.9 (ветеран), 27thx
Активность: 0.080
Статус: Участник

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

Еще раз большое спасибо, реально помог!


 eXeL@B —› Оффтоп —› Помогите с С/C++! (важно)

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

   Для печати Для печати