无限消息框

时间:2014-01-25 10:35:23

标签: c

我需要一点帮助。代码似乎很好。但是当我运行并输入一个非数字数字时,它会无限地显示消息框错误,除非我终止程序,否则不会停止。有人能给我一个解决方法吗?谢谢!

CODE:

 #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <ctype.h>
    #define pi 3.1416

    int main()
    {
        float rad, area, dia, circ;
        int radint;
        char resp;
        start:
        system("cls");
        printf("Chapter 1 \t\t\tProblem 1\n\n");
        printf("Input the circle's radius: ");
        radint = scanf("%f", &rad);
        if(rad < 0)
        {
            MessageBox(0, "There cannot be negative measurements.", "Negative Value", 0);
goto start;
        }
        if(radint < 1)
        {
            MessageBox(0, "Non-numeric value is inputted.", "Character Value", 0);
            goto start;
        }
        dia = rad * 2;
        circ = 2 * pi * rad;
        area = pi * rad * rad;
        printf("\n\nDiameter = %0.2f | Circumference = %0.2f | Area = %0.2f\n\n", dia, circ, area);
        printf("Try again? [Y/N]: ");
        ret:
        resp = getchar();
        switch(resp)
        {
            case 'y': goto start;
            case 'n': return;
            default: goto ret;
        }
    }

2 个答案:

答案 0 :(得分:3)

您正在isalpha上致电floatisalpha需要一个小整数。

来自标准:

  

标题声明了几个对分类有用的函数   和映射字符.198)在所有情况下,参数都是一个int,即   其值应表示为无符号字符或应   等于宏EOF的值。如果参数有任何其他值,   这种行为是未定的。

有一些人为的方法让isalpha能够使用float,但这可能不是你想要的。

您根本不需要使用isalpha。正如Stefano Sanfilippo在另一个答案中建议的那样,您只需检查scanf返回的值:成功匹配的数量

换句话说,如果你要求浮点数并且scanf返回1,那么用户必须输入一些看起来像float的内容,你可以使用它。

答案 1 :(得分:0)

isalpha期望int作为输入(实际上解释为unsigned charEOF),而不是浮点数。您作为参数传递的数字将转换为int,并且不在字母数字范围内。

您可以通过测试scanf的返回值

来检查号码是否已正确解析
int converted = scanf("%f", &rad);

if (converted < 1) {
    MessageBox(0, "Non-numeric value is inputted.", "Character Value", 0);
}

并删除isalpha分支。