将float输入读取为int和infinte循环

时间:2016-02-19 10:06:45

标签: c scanf

我正在尝试处理人为错误,如果我输入错误的输入(如浮点值),程序会再次提示输入。

我是通过检查scanf是否未返回正确的扫描输入数量(此处为3)然后再次询问来完成此操作。

但是,如果输入“5.4(float)3 2”或“4 5.4(float)3”作为输入,则获得无限循环,如果输入“5 4 3.2”,则获取int值。

我想知道为什么会这样。

我知道使用多个scanf的解决方法。但我想知道原因。 这是我的代码:

#include <stdio.h>
int main(){
    int a,b,c,largest,error;
    do{
       printf("Enter three numbers to find largest:");
       error = scanf("%d %d %d",&a,&b,&c);
    }while(error != 3);
}

2 个答案:

答案 0 :(得分:0)

我知道最简单的方法是读取字符串行,然后你必须尝试将其转换为数据类型。

在这种情况下,例如,如果您找到“。”或“,”你可以显示错误消息。

要将字符串转换为数据类型,您可以使用sscanf

如果使用scanf,某些字符可以保留在stdin(标准输入)缓冲区中,因此下次使用scanf时可以获得旧字符。

答案 1 :(得分:0)

"5.4 3 2""4 5.4 3"是相对简单的顶级句柄,因为当&#39;。&#39;由scanf()消耗,它立即得知必定有错误。

然而,"4 3 5.4"并非如此微不足道。在scanf()消耗"4 3 5"后,它会返回3以表示已成功扫描3个整数,并在".4"中保留stdin。因此,对于这种情况,scanf()的返回值就足够了。

这是我的代码:

#include <stdio.h>

int main(void)
{
    int a, b, c, error;
    do
    {
        printf("Enter three numbers to find largest:");
        error = scanf(" %d %d %d", &a, &b, &c);
        if (getchar() != '\n')
        {
            error = 0;
            scanf("%*[^\n]");
        }
    }
    while(error != 3);
    return 0;
}

scanf("%*[^\n]");用于丢弃stdin中的所有字符,直到&#39; \ n&#39;。导致"%d %d %d"的空格告诉scanf()丢弃一个或多个空白字符(包括&#39;&#39;&#39; \ n&#39;和&#39; \ t&# 39;)直到满足第一个非空白字符。

事实上,您甚至不必检查scanf()的返回值:

#include <stdio.h>

int main(void)
{
    int a, b, c;
    for(;;)
    {
        printf("Enter three numbers to find largest:");
        scanf(" %d %d %d", &a, &b, &c);
        if (getchar() == '\n')
        {
            break; // successful
        }
        scanf("%*[^\n]");
    }
    return 0;
}