在我的任务中,我需要使用循环并获得1-5之间的输入,如果我得到任何其他输入,我需要继续迭代,直到我得到1-5。
你可以告诉我我做错了什么吗?我的部分代码:
int rateSelected, weeklyHours;
printf("Enter the number corresponding to the desired pay rate or action:\n");
printf("1) %.2lf$/hr 2) %.2lf$/hr\n", RATE1, RATE2);
printf("3) %.2lf$/hr 4) %.2lf$/hr\n", RATE3, RATE4);
printf("5) Quit\n");
while ((scanf("%d", &rateSelected)) != EOF && rateSelected != 5)
{
if (rateSelected > 5 || isalpha(rateSelected) ==1){
printf("please enter a number between 1-5:\n");
continue;
}
printf("Now enter your weekly hours:\n");
scanf("%d", &weeklyHours);
ChoosePayRate(rateSelected, weeklyHours);
}
TNX
答案 0 :(得分:2)
问题是您使用%d
格式说明符。输入字母而不是数字时,scanf
返回零表示没有读取任何内容。如果您希望允许输入字母和数字,则应在scanf
返回零时添加字符串读取,或者始终读入字符串缓冲区,然后使用sscanf
或{{1将字符串转换为整数。
答案 1 :(得分:0)
删除isalpha(rateSelected)
。
isalpha()
检查作为参数传递的值是否为字母数字字符 - 但是您传递的是刚刚读过的int
值。
但是,这仍然不够 - 您需要从scanf()
捕获返回值,以检查scanf()
是否实际读取了int
。但是如果没有输入int,则不会丢弃字符,以便下一个scanf()将再次尝试转换它们,这将导致无限循环。
更好地使用@dasblinkenlight提供的解决方案。
答案 2 :(得分:0)
isalpha(rateselected)
永远不会成为现实,因为您在rateselected
中存储了一个int。
scanf("%d",rateselected)
allready负责捕获字符输入,如果是这种情况则返回0。因此,您应该将isalpha
测试更改为rateselected == 0
测试。
此外,scanf永远不会返回EOF。它将返回0,然后您需要测试feof(stdin)
以查看您是否真的达到输入结束。 (对应于键盘输入的ctrl-Z
)。
答案 3 :(得分:0)
最好使用fgets()
和strtol()
。 Scanf和stdio
的行缓冲并不是很有用......
char line[LINE_MAX];
do {
fgets(line, sizeof(line), stdin);
} while(!isdigit(line[0]));
int choice = strtol(line, NULL, 10);
答案 4 :(得分:0)
使用此:
int e;
while ((e = scanf("%d", &rateSelected)) != EOF)
{
scanf("%*[^\n]"); // this clean your input buffer
if (e==0 || rateSelected>5 || rateSelected<1) {
printf("please enter a number between 1-5:\n");
continue;
}
而不是
while ((scanf("%d", &rateSelected)) != EOF && rateSelected != 5)
{
if (rateSelected > 5 || isalpha(rateSelected) ==1){
printf("please enter a number between 1-5:\n");
continue;
}