重新提示用户,直到他/她输入大于1的正整数值

时间:2016-10-19 17:48:30

标签: c validation input cs50

我正在解决CS50(问题集1),即water.c。它要求用户编写一个程序,在几分钟内提示用户他或她的淋浴时间长度(作为正整数),然后打印相同数量的水瓶(作为整数)。 淋浴1分钟=消耗12瓶 主要问题:问题是我们必须确保用户输入正数分钟,否则它会继续重新提示他返回输入/ scanf语句。只要他进入他进入长度< = 0,我就可以使用while(长度< = 0)条件重新提示他,但当他输入一个字符,即输入中的abc123时,我的代码继续执行。有解决方案??

>

 #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 个答案:

答案 0 :(得分: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的返回值,即成功转换的项目数。

答案 1 :(得分: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

答案 2 :(得分:1)

你不需要循环外的第一个提示,因为你已经将长度初始化为零,所以循环将至少提示一次。

在除Wndows以外的大多数平台上,您需要刷新标准输出以显示未以换行符终止的文本。

只要缓存换行符并且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;
}

答案 3 :(得分:0)

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