我需要一点帮助。代码似乎很好。但是当我运行并输入一个非数字数字时,它会无限地显示消息框错误,除非我终止程序,否则不会停止。有人能给我一个解决方法吗?谢谢!
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;
}
}
答案 0 :(得分:3)
您正在isalpha
上致电float
。 isalpha
需要一个小整数。
来自标准:
标题声明了几个对分类有用的函数 和映射字符.198)在所有情况下,参数都是一个int,即 其值应表示为无符号字符或应 等于宏EOF的值。如果参数有任何其他值, 这种行为是未定的。
有一些人为的方法让isalpha
能够使用float
,但这可能不是你想要的。
您根本不需要使用isalpha
。正如Stefano Sanfilippo在另一个答案中建议的那样,您只需检查scanf
返回的值:成功匹配的数量。
换句话说,如果你要求浮点数并且scanf
返回1,那么用户必须输入一些看起来像float
的内容,你可以使用它。
答案 1 :(得分:0)
isalpha
期望int
作为输入(实际上解释为unsigned char
或EOF
),而不是浮点数。您作为参数传递的数字将转换为int
,并且不在字母数字范围内。
您可以通过测试scanf
的返回值
int converted = scanf("%f", &rad);
if (converted < 1) {
MessageBox(0, "Non-numeric value is inputted.", "Character Value", 0);
}
并删除isalpha
分支。