如何在C中输入字母时终止循环?

时间:2013-01-29 15:06:38

标签: c

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

5 个答案:

答案 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;
        }