2015-04-26 2 views
0

я это сделал, но, к сожалению, она не работает, и сбой при входе символ/строка и т.д.Как убедиться, что пользователь вводит положительное число

Как я могу это исправить?

while((scanf("%d",&numOfDef) != 1) && (numOfDef>0)) 
{ 
    printf("not a pos num try again"); 
} 
+2

numOfDef> 0 в точности противоположно тому, что вам нужно, попробуйте с numOfDef <1 –

ответ

0

На самом деле, два изменения должны быть сделаны: while((scanf("%d",&numOfDef) >= 0) && !(numOfDef>0))

Во-первых, сравните возвращаемое значение scanf с 0, во-вторых, условие должно быть !(numOfDef>0) или (numOfDef<=0)

Возврат значение scanf (Источник : http://www.geeksforgeeks.org/g-fact-10/)

В C, printf() возвращает количество символов, успешно записанных на выходе, и scanf() возвращает количество успешно прочитанных элементов.

Ideone ссылка для кода: http://ideone.com/TjtuDy

+0

Если scanf сбой, он возвращает 0, и в этом случае цикл завершается, а numOfDef не устанавливается. Переменная остается неинициализированной. Это не желаемое поведение. – 2501

+0

, когда я предлагаю вам, его не сбой, но и пропустить время, даже не вводя positve intger –

+0

@RazBenNetanel: Работает ли он сейчас? –

0
numOfDef = 0; 
while((scanf("%d",&numOfDef) != 1) || (numOfDef<=0)) 
{ 
    printf("not a pos num try again\n"); 
    int ch; 
    while((ch=getchar())!= '\n' && ch != EOF); 
    if(ch == EOF){ 
     numOfDef = 0; 
     break; 
    } 
} 
if(numOfDef == 0) 
    puts("Processing was discontinued."); 
... 
+0

Нельзя сказать, что это ошибка. потому что из-за чего желание OP. – BLUEPIXY

+0

Правильный ввод неясен. – BLUEPIXY

+0

[DEMO] (http://ideone.com/jARe3Y) – BLUEPIXY

0

Часто бывает проще обрабатывать ввод в виде строки символов, даже при приеме численного ввода от пользователя, а затем преобразовать строку в число:

#include<stdio.h> 

int main (void) { 

    char buf[32] = {0}; 
    int num = -1; 

    while (num < 0) { 
     printf (" Enter a positive number: "); 
     if (scanf (" %[^\n]%*c", buf) == 1) { 
      if (*buf < '0' || *buf > '9') continue; 
      sscanf (buf, " %d", &num); 
     } 
    } 

    printf ("\n You entered : %d\n\n", num); 

    return 0; 
} 

Выход

$ ./bin/positive_entry 
Enter a positive number: --1--1 1--1 
Enter a positive number: #%@#&%$ u08$ 
Enter a positive number: wise guys^2 
Enter a positive number: -127 
Enter a positive number: -3 
Enter a positive number: a 
Enter a positive number: 2 

You entered : 2 
+0

, если scanf сбой (возвращает значение не 1), цикл завершается, и вы печатаете значение, которое не является положительным. – 2501

+0

Вы можете защитить от угловых шкафов, отрегулировав тест. Это пример. –

+0

Несомненно, я просто упоминал об этом, поскольку OP не было ясно, что такое точное требование. – 2501

Смежные вопросы