我知道有错误的" Bad Input"但由于某种原因,我甚至无法获得良好的投入。它要么返回10或0的值,我似乎无法找到原因。以下是我称之为的地方:
var1
是数据类型float。包含所有必需的标头。 floatHolder
是数据类型char array。以下是我打电话的地方:
scanf("%s", &floatHolder);
var1 = inputchecker(floatHolder);
这是被称为的函数:
float inputchecker(char *charArray)
{
float f = 0;
float f2 = 0;
int i = 0;
int z = 0;
int badInput = 0;
char errorArray[15];
func1:
while (i<strlen(charArray))
{
if (charArray[i]<48 || charArray[i]>57)
{
if (charArray[i] == 46)
{
i++;
goto func1;
}
printf("\n Entered value contains alphabets or symbols, please enter numerical/Floating point values only.\n");
printf("Re-enter Correct Input Please: ");
scanf("%s", &errorArray);
getchar();
badInput = 1;
goto func2;
}
i++;
}
func2:
while (z < strlen(errorArray) && badInput == 1)
{
if (errorArray[i] < 48 || errorArray[i]>57)
{
if (errorArray[i] == 46)
{
z++;
goto func2;
}
printf("Re-enter Correct Input Please: ");
scanf("%s", &errorArray);
getchar();
}
z++;
}
badInput = 0;
f = atof(charArray);
f2 = atof(errorArray);
if (f == 0)
{
return f2;
}
if (f2 == 0)
{
return f;
}
}
在调用函数后出于某种原因,它显示正确的返回值ex。如果我给它4它将返回4但是var1将显示一个非常大的数字,0和10.如果有人能让我知道我做错了什么,那将非常感激。
答案 0 :(得分:0)
我尝试了你的日常工作,并收到了类似的结果。然后我意识到你的问题是什么。您可能忽略了将函数原型放在文件的顶部。
float inputchecker(char *charArray);
通过忽略使用原型,编译器必须猜测函数的签名,并且堆栈可能无法正确恢复,然后您的返回值将被破坏。
当我在文件顶部添加原型时,一切都可以正常用于有效的浮动输入,例如3.14
注意:不同版本的C的行为会有所不同。例如,C89 / C90将“猜测”没有原型的参数。这可能非常危险,这是我认为在你的情况下发生的事情。我认为C99的工作方式类似,但存在一些差异。
另一个证明您没有使用原型的证据是您正在接收整数答案。当编译器'猜测'原型时,它通常会返回一个int。此外,这也解释了为什么您为不同的输入获得相同的结果,由于堆栈损坏,您获得相同内存位置的内容(而不是您的f变量)。
总是在文件顶部定义函数原型是非常好的做法。