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

在c中使用atof时出现奇怪的错误,c,C,我知道有一些错误与“坏输入”,但出于某种原因,我甚至不能得到好的输入通过。它要么返回10,要么返回0,我似乎找不到原因。下面是我的称呼: var1是数据类型float。包含所有需要的标题 floatHolder是数据类型char数组 下面是我的称呼: scanf("%s", &floatHolder); var1 = inputchecker(floatHolder); 这是所调用的函数: float inputchecker(char *charArray) { float f

我知道有一些错误与“坏输入”,但出于某种原因,我甚至不能得到好的输入通过。它要么返回10,要么返回0,我似乎找不到原因。下面是我的称呼:

  • var1
    是数据类型float。包含所有需要的标题
  • floatHolder
    是数据类型char数组
下面是我的称呼:

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;
}
}
float输入检测器(char*charArray)
{
浮点数f=0;
浮动f2=0;
int i=0;
int z=0;
输入=0;
字符错误数组[15];
职能1:
while(i57)
{
if(errorArray[i]==46)
{
z++;
后藤2号;
}
printf(“请重新输入正确的输入:”);
scanf(“%s”、&errorArray);
getchar();
}
z++;
}
输入=0;
f=atof(charArray);
f2=atof(错误数组);
如果(f==0)
{
返回f2;
}
如果(f2==0)
{
返回f;
}
}

由于某种原因,在调用函数后,它会显示一个正确的返回值ex。如果我给它4,它将返回4,但var1将显示一个非常大的数字0和10。如果有人能让我知道我做错了什么,我将不胜感激

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

float inputchecker(char *charArray);
如果忽略使用原型,编译器将不得不猜测函数的签名,堆栈可能无法正确恢复,返回值将被破坏

当我在文件顶部添加原型时,对于有效的浮点输入(如3.14),一切都正常工作

注意:不同版本的C将表现不同。例如,C89/C90将“猜测”在没有原型的情况下参数是什么。这可能是相当危险的,我认为这是在你的情况下发生的。我认为C99的工作方式类似,但有一些不同

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


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

当你说它将“显示”错误的数字时,可能有一个
printf
语句没有显示给我们??while(zif previor
scanf(“%s”)中
errorArray[]
的内容是什么,&errorArray);
从未被调用过?当
循环时,你到底想对这两个
做什么?只需在
atof
中抛出
charArray
并处理任何错误……旁白:我可以从第一个两行代码片段中看出
floatHolder
必须是
char
的数组,因此
scanf(“%s”,&floatHolder)
应该是
scanf(“%s”,floatHolder);
和类似的
scanf(“%s”,和errorArray);
应该是
scanf(“%s”,errorArray)
。另外,请避免使用幻数,大概
46
48
57
应该是
'0'
'9'
。不要只告诉我们所有需要的标题都包含在内,让我们看看。非常感谢您100%修复了它,我不敢相信我没有想到。傻雾阿克斯总是最让我们烦恼的人。
float inputchecker(char *charArray);