2016-10-19 1 views
-2

Я решаю CS50 (проблема 1) i.e water.c. Он просит пользователя написать программу, которая запрашивает у пользователя длину его или ее душа в минутах (как положительное целое число), а затем печатает эквивалентное количество бутылок воды (в виде целого числа). 1 мин. Ливня = 12 бутылок потребляется ОСНОВНАЯ ПРОБЛЕМА: Проблема в том, что мы должны гарантировать, что пользователь вводит положительное количество минут, в противном случае он будет снова запрашивать его обратно в инструкции ввода/сканирования. Пока он входит, он вводит длину < = 0, я могу повторно пригласить его обратно, используя while (длина < = 0), но когда он вводит символ i.e abc123 во вход, мой код продолжает выполняться. Любые решения?Повторный запрос пользователя до тех пор, пока он/она не введет положительное целое значение больше 1

>

#include <stdio.h> 
int main() 
{ int length=0; 
    int min=12; 
    int bottle=0; 
    printf("Enter length of his or her shower in minutes"); 
    scanf("%d", &length); 
    while (length <= 0){ 
    printf("Enter length of his or her shower in minutes"); 
    scanf("%d", &length); 
    } 
    bottle= (min*length); 
    printf("%d", bottle); 

    return 0; 
} 
+2

Покажите нам, что вы делали до сих пор, не только просим нас написать код для вас –

+1

отредактированных, теперь вы можете видеть мой код :) –

+0

посмотри на 'strtol' , Вы можете прочитать ввод как строку, используйте 'strtol', чтобы преобразовать строку в целое число, и если во время преобразования есть какая-либо ошибка,' strtol' укажет ее, установив errno: https://linux.die.net/man/3/strtol – yano

ответ

5

Вы можете решить эту проблему, читая строку, а затем извлекая любое количество:

#include <stdio.h> 

int main(void) 
{ 
    int length = 0; 
    char input[100]; 
    while(length <= 0) { 
     printf("Enter length: "); 
     fflush(stdout); 
     if(fgets(input, sizeof input, stdin) != NULL) { 
      if(sscanf(input, "%d", &length) != 1) { 
       length = 0; 
      } 
     } 
    } 

    printf("length = %d\n", length); 
    return 0; 
} 

Программа сессии:

Enter length: 0 
Enter length: -1 
Enter length: abd3 
Enter length: 4 
length = 4 

Кардинально, я всегда проверять возвращаемое значение scanf , количество успешно конвертированных элементов.

+0

Я не хочу быть средним: D, но почему 'int main (int argc, char const * argv [])' Если программа не использует эти аргументы? Просто спрашиваю. По-моему, должно быть 'int main (void)' – Michi

+0

@Michi oh ok, это был только мой стандартный тестовый файл, отредактированный. –

+0

Хотя это можно сделать с помощью 'scanf()' этот метод, как правило, гораздо менее проблематичен и, вероятно, проще. – Clifford

0
int min = 0; 
do { 
    printf("Enter minutes: "); 
    scanf("%i", &min); 
} while(min <= 0); 
//programs resumes after this. 
+0

Если вы вводите любой символ, он работает бесконечно. Я хочу только положительное целочисленное значение, иначе re prompt! –

+0

SO не является учебным сайтом, вы должны объяснить что-то, чтобы сделать его ответом, а не учебником. – Michi

+0

@HamzaAzam Probabli [Это то, что вам нужно] (http://ideone.com/u5MOy6). Проверьте следующее [здесь] (http://stackoverflow.com/questions/32671751/c-getchar-doesnt-wait-for-input-conditional-loop-doesnt-int/32671910#32671910), [здесь] (http: //stackoverflow.com/questions/34165592/scanf-skipped-after-reading-in-integer-in-c-in-while-loop/34165759#34165759) и [здесь] (http://stackoverflow.com/questions/31770861/Validate-параметр-в-0-или-1/31772378 # 31772378). Должен отвечать на все ваши вопросы. – Michi

1

Вам не нужен первый запрос вне цикла, потому что вы уже инициализированы длиной до нуля, так что цикл будет предложен по крайней мере один раз.

На большинстве платформ, кроме Wndows, вам нужно сбросить stdout, чтобы показать текст, не оканчивающийся символом новой строки.

scanf вернется до тех пор, как символ новой строки в буфере и %d в одиночку не будет потреблять символ новой строки, так что вы должны убедиться, что все оставшиеся символы до и включая символ новой строки очищается, чтобы предотвратить бесконечный цикл.

Рекомендуется проверять возвращаемое значение от scanf(), так как он не гарантирует, что не будет изменять его аргументы, даже если сбой преобразования.

Непонятно, почему min - переменная здесь синус, она инициализирована, но никогда не переустанавливается, но, возможно, это может быть в последней программе?

#include <stdio.h> 

int main(void) 
{ 
    int length = 0 ; 
    int min = 12 ; 
    int bottle = 0 ; 

    while(length <= 0) 
    { 
     int converted = 0 ; 

     printf("Enter length of his or her shower in minutes: ") ; 
     fflush(stdout) ; 
     converted = scanf("%d", &length) ; 
     if(converted != 1) 
     { 
      length = 0 ; 
     } 

     while((c = getchar()) != '\n' && c != EOF) { } // flush line buffer 
    } 

    bottle = min * length ; 
    printf("%d", bottle) ; 

    return 0; 
} 
+0

'main' подпись должна быть не менее' int main (void) {} ​​'или' int main (int argc, char * argv []) {} ' – Michi

+0

OP уже объяснил в Above Answer:' Если вы вводите какой-либо символ, он работает бесконечно. 'Ваш ответ, похоже, не исправляет это. что-то вроде [This] (http://ideone.com/u5MOy6) – Michi

+0

'while (getchar()! = '\ n') {}' -> бесконечный цикл на EOF. Хотя я сомневаюсь, что OP закроет 'stdin '. – chux

2

Если вы не заботитесь о том, как входы 1f то вышеуказанные ответы одобрены для вас, но если вы не хотите, чтобы принять этот вид ввода, то следующий подход делает что-то вроде этого:

#include<stdio.h> 

int checkInput(void); 
int main(void){ 
    int number = checkInput(); 

    printf("\nYour number is\t%d\n",number); 

    return 0; 
} 

int checkInput(void){ 
    int option,check; 
    char c; 

    do{ 
     printf("Please type a number:\t"); 

     if(scanf("%d%c",&option,&c) == 0 || c != '\n'){ 
      while((check = getchar()) != 0 && check != '\n' && check != EOF); 
      printf("\tI sayed a Number please\n\n"); 
     }else{ 
      if (option < 1){ 
       printf("Wrong input!\n"); 
      }else{ 
       break; 
      } 
     } 
    }while(1); 

    return option; 
} 

Выход:

Please type a number: 1f 
    I sayed a Number please 

Please type a number: f1 
    I sayed a Number please 

Please type a number: -1 
    Wrong input! 
Please type a number: 1 

Your number is 1 
+0

Это принимает '-1' как вход. –

+0

@WeatherVane Вы правы: D. Но Мой ответ не концентрируется на этом. Я уже говорил, что речь идет о входах типа '1f' или' f1'. И я тоже не хочу делать свой ответ в учебнике: d. – Michi

+0

'(check = getchar())! = 0' любопытно. Зачем проверять «0»? – chux

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