如果输入为负数或字母,如何让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();
}
}
};
答案 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;
}
输出如下:
剩下的唯一问题是,当我想第二次添加另一个项目(添加食物)并输入一个字母或一个负数时,它不会通过if语句运行。