2017-01-11 1 views
-1

Попытка проверить целое число, но когда введен неправильный тип значения, появляется бесконечный цикл первого printf.C Пытается проверить целое число

int main(int argc, char *argv[]) { 
int input; 
do{ 
    int starCount; 
    printf("Please enter a number:"); 
    scanf("%d",input); 
    do{ 
     scanf("%d",&input); 
    }while(isdigit(input)); 
    for(starCount=0; starCount<input; starCount++){ 
     printf("*"); 
    } 
    printf("\n");  
}while(input>0); 

return 0; 

}

+0

Я предлагаю прочитать некоторые [документы для функции scanf] (http://www.cplusplus.com/reference/cstdio/scanf/), а затем мысленно имитировать выполнение вашего кода, чтобы понять, почему он не работает. – Adrian

+2

1) Почему существует вызов функции 'scanf()' перед циклом? 2) Вы должны проверить значение, возвращаемое вызовом 'scanf()'. –

+1

У вас есть два вызова 'scanf', это подозрительно. То, что первый из них не передает свою переменную по адресу, вызывает * неопределенное поведение *. Я начну с них. – WhozCraig

ответ

0

Ваша логика не так по двум причинам:

  • Вы проверили input в конце do..while, но использовали его ранее в for цикле.
  • Нет необходимости использовать двойной цикл do..while.

Существует еще одна ошибка с вашей начальной scanf, а также:

scanf("%d", input); // <-- should be `&input` 

За то, что вам нужно, один do..while будет хватай:

int input; 
    do{ 
     int starCount; 
     printf("Please enter a number:"); 
     if(1 != scanf("%d",&input) || input < 0) // <-- check return value of scanf and valid `input` 
     { 
      break; 
     } 
     for(starCount=0; starCount<input; starCount++){ 
      printf("*"); 
     } 
     printf("\n");  
    }while(1); 

Обратите внимание, что вы можете/следует использовать возвращаемое значение scanf и проверить, действительно ли input действителен до for петля.

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