如果输入是负数或字母,如何让我的if语句要求用户再试一次?

时间:2017-10-17 01:51:20

标签: c if-statement

如果输入为负数或字母,如何让if语句要求用户再试一次?

struct foodstuff {
    float amount;
};

void add(struct foodstuff *tmpAdd) {
    printf("Write amount: ");
    scanf("%f", &tmpAdd->amount);

    while (tmpAdd->amount != 0) {

        if (tmpAdd->amount < -1 || isalpha(tmpAdd->amount)) {
            printf("Type in a valid number!\n");
            printf("Write amount: ");
            getchar();
            scanf("%f", &tmpAdd->amount);
            getchar();
    }
    else {
        scanf("%f", &tmpAdd->amount);
        getchar();
    }
   }
 };

3 个答案:

答案 0 :(得分:2)

我认为您可以将代码重新改为使用do循环代替:

do {
    printf("Enter a positive number with no characters:\n");
    int result = scanf("%f", &tmpAdd->amount);
while (tmpAdd->amount <= 0 || result != 1);

请注意,我已移除对isalpha()的调用,该调用一次只能处理一个字符。相反,我建议只检查输入的数字是否为有效浮点数并且大于零。如果scanf没有成功读入有效的float,那么它的返回值将不是1并且循环将重复。输入有效浮点数的情况也是如此。

答案 1 :(得分:0)

正如chux所述,您可以先使用fgets()阅读输入,然后解析它。

char buff[100], *ptr;
float f;
while(fgets(buff, sizeof(buff), stdin)!=NULL)
{
    buff[strlen(buff)-1]='\0';
    f=strtof(buff, &ptr);
    if(errno==ERANGE)
    {
        printf("\nPossible overflow.");
        errno=0;
        continue;
    }
    if(f<0 || *ptr!='\0')
    {
        printf("Type in a valid number!\n");
        continue;
    }
    tmpAdd->amount=f;
    printf("\n%f", f);
}

这里,fgets()用于读取每次迭代的输入。 <{1}}出错时会返回fgets()

NULL

已完成,因为buff[strlen(buff)-1]='\0'; 也会在尾随fgets()中读到\n。我们将buff修改为\n字符,表示字符串结尾为\0

strtof()用于从buff[strlen(buff)-1]='\0';中提取值。 它位于buff

如果stdlib.h具有除数字之外的其他内容,则数字部分将由buff转换并返回,并且strtof()指针将指向第一个非数字部分ptr

因此,如果buff指向的字符串中的第一个字符是ptr字符,则\0中没有非数字部分。

如果输入值太大或太小而无法容纳buff,则float将设置为errno。您需要包含ERANGE

如果发生溢出(或下溢),我们会将errno.h设置为errno并继续。

即使0(tmpAdd->amount<-1)tmpAdd->amount为否定,-1也会为假。您需要-1代替。

此外,只有当(tmpAdd->amount<0)变为tmpAdd->amount时,您的循环才会退出。你可以简单地做

0

如果可以的话。

否则,您可以添加

tmpAdd->amount=0;

if(f==0) { break; } 循环结束时。

答案 2 :(得分:0)

我对我的代码做了一些更改,现在看起来像这样:

printf("Write amount: ");
scanf("%f", &(tmpAdd + index)->amount);
getchar();
do {

    if (tmpAdd->amount <= -1 || isalpha(tmpAdd->amount != 0)) {
        printf("Type in a valid number!\n");
        printf("Write amount: ");
        scanf("%f", &(tmpAdd + index)->amount);
        getchar();
    }
    else if (isdigit(tmpAdd->amount >= 0)) {
        scanf("%f", &(tmpAdd + index)->amount);
        //getchar();
    }
} while (tmpAdd->amount <= -1 || isalpha(tmpAdd->amount != 0));
};

Main看起来像这样:

int main (void) {

int input, noFood = 0;
int flag = 1;

printf("Welcome to the shopping list manager. \n\n");

struct foodstuff food1;

while (flag == 1) {

    printf("1 - add food\n");
    printf("2 - print shopping list\n");
    printf("3 - end\n\n");
    printf("What do you want to do? ");
    scanf("%d", &input);
    clear();

    switch (input) {
    case 1: add(&food1, noFood); noFood++; break;
    case 2: print(&food1, noFood); break;
    case 3: printf("\nExiting program\n"); flag = 0; break;
    default: printf("Please enter a valid choice\n");
    }
}
return 0;
}

输出如下:

Output

剩下的唯一问题是,当我想第二次添加另一个项目(添加食物)并输入一个字母或一个负数时,它不会通过if语句运行。