在c中使用atof时出现奇怪的错误

时间:2017-02-14 19:49:33

标签: c

我知道有错误的" 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.如果有人能让我知道我做错了什么,那将非常感激。

1 个答案:

答案 0 :(得分:0)

我尝试了你的日常工作,并收到了类似的结果。然后我意识到你的问题是什么。您可能忽略了将函数原型放在文件的顶部。

float inputchecker(char *charArray);

通过忽略使用原型,编译器必须猜测函数的签名,并且堆栈可能无法正确恢复,然后您的返回值将被破坏。

当我在文件顶部添加原型时,一切都可以正常用于有效的浮动输入,例如3.14

注意:不同版本的C的行为会有所不同。例如,C89 / C90将“猜测”没有原型的参数。这可能非常危险,这是我认为在你的情况下发生的事情。我认为C99的工作方式类似,但存在一些差异。

另一个证明您没有使用原型的证据是您正在接收整数答案。当编译器'猜测'原型时,它通常会返回一个int。此外,这也解释了为什么您为不同的输入获得相同的结果,由于堆栈损坏,您获得相同内存位置的内容(而不是您的f变量)。

总是在文件顶部定义函数原型是非常好的做法。