Re-prompting a user until he/she enters a positive

2019-09-21 10:56发布

I'm solving CS50 (problemset 1) i.e water.c. It asks user to write a program that prompts the user for the length of his or her shower in minutes (as a positive integer) and then prints the equivalent number of bottles of water (as an integer). 1 min of shower = 12 bottles consumed MAIN PROBLEM: The problem is that we have to ensure that the user inputs a positive number of minutes otherwise it keeps on re-prompting his back to input/scanf statement. As long as he enters he enters length<=0, I can re-prompt him back using while(length<=0) condition but as he enters a character i.e abc123 in input my code keeps on executing. Any solutions??

>

 #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;
 }

4条回答
We Are One
2楼-- · 2019-09-21 11:34
int min = 0;
do {
   printf("Enter minutes: ");
   scanf("%i", &min);
} while(min <= 0);
//programs resumes after this.
查看更多
一夜七次
3楼-- · 2019-09-21 11:37

If you don't care about Inputs like 1f then the Above Answers are ok For you, but if you do not want to accept this kind of Input, then the following approach does something like that:

#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;
}

Output:

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
查看更多
聊天终结者
4楼-- · 2019-09-21 11:41

You don't need the first prompt outside the loop because you have already initialised length to zero, so the loop will prompt at least once.

On most platforms other then Wndows, you need to flush stdout to show text not terminated with a newline.

scanf will return so long as a newline character is buffered and %d alone will not consume the newline, so you need to ensure that any remaining characters up to and including the newline are flushed to prevent an endless loop.

It is good practice to check the return value from scanf() since it makes no guaranteed about not modifying its arguments even when a conversion fails.

It is not clear why min is a variable here sine it is initialised but never re-assigned, but presumably that may be the case in the final program?

#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;
}
查看更多
Deceive 欺骗
5楼-- · 2019-09-21 11:49

You can solve this by reading a string first, and then extracting any number:

#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;
}

Program session:

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

Crucially, I always check the return value from scanf, the number of items successfully converted.

查看更多
登录 后发表回答