1

在我的任务中,我需要使用循环并获得 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

4

5 回答 5

2

问题是您使用%d格式说明符。当输入字母而不是数字时,scanf返回零以指示未读取任何内容。如果您希望允许输入字母和数字,则应在scanf返回零时添加对字符串的读取,或始终读取到字符串缓冲区,然后使用sscanfatoi将字符串转换为整数。

于 2013-01-29T15:10:24.700 回答
0

删除isalpha(rateSelected).

isalpha()检查作为参数传递的int值是否是字母数字字符 - 但您传递的是刚刚读取的值。

但是,这仍然不够——您需要捕获返回值scanf()以检查是否scanf()实际读取了int. 但如果没有输入 int,则字符不会被丢弃,因此下一个 scanf() 将再次尝试转换它们,从而导致无限循环。更好地使用@dasblinkenlight 提供的解决方案。

于 2013-01-29T15:10:11.017 回答
0

isalpha(rateselected)永远不会是真的,因为您将 int 存储在rateselected. scanf("%d",rateselected)allready 负责捕获字符输入,如果是这种情况,则返回 0。因此,您应该将isalpha测试更改为rateselected == 0测试。

此外,scanf 永远不会返回 EOF。它会返回 0,然后你需要测试feof(stdin)一下你是否真的到达了输入的末尾。(这将对应ctrl-Z于键盘输入)。

于 2013-01-29T15:10:49.560 回答
0

你最好使用fgets()strtol()为此。Scanf 和 line-bufferingstdio一起不是很有帮助......

char line[LINE_MAX];
do {
    fgets(line, sizeof(line), stdin);
} while(!isdigit(line[0]));
int choice = strtol(line, NULL, 10);
于 2013-01-29T15:12:33.213 回答
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;
        }
于 2013-01-29T15:19:19.310 回答