strtof-返回错误的号码

时间:2018-10-22 11:34:49

标签: c string

编辑-

因此,我知道没有解决此问题的方法。有人知道C中的一个函数会从array(str)返回31-38索引吗?

嘿,我的strtof功能有问题,我在Internet上找不到解决方案,有人可以帮忙吗?

这是一个简单的功能:

float getCord(int placeOnArray, char str[80]){
   char str2[7];
   for (int i=placeOnArray ;i<placeOnArray+7;i++){
      str2[i-placeOnArray]=str[i];
   }
   float f1;
   f1=strtof(str2,NULL);
   return f1;

    }

输入-str = ATOM 1 N ASN A 1 -4.890 -12.296 -15.280 1.00 30.36 N ,放在array = 31上

所需结果:-4.890 ,返回结果:-4.88999987

3 个答案:

答案 0 :(得分:1)

strtof可以正常工作:

包括这个小程序:

#include <stdio.h> 
#include <stdlib.h>

int main () 
{
  float f = strtof("4.890", NULL);
  printf("%10.10f\n", f);
} 

输出为:

4.8899998665

在浮点数中没有4.890的确切表示。您需要阅读这篇SO文章:

您的getCord函数也是错误的:

这是一种更简单正确的替代方法:

float getCord(int placeOnArray, char str[]) {
  return strtof(str + placeOnArray, NULL);
}

无需提取代表数字的字符串,您可以直接扫描原始字符串中的数字。 strtof将停在与0-9'.'不同的第一个字符处。将上面程序中的第一行更改为float f = strtof("4.890 ", NULL);,输出将相同。

答案 1 :(得分:0)

  

所需结果:-4.890,返回结果:-4.88999987

在浮点运算中总会有一些错误。这是预料之中的,程序员应注意。

这就是为什么不能将iphp->addr[1]用于浮点数的原因。您需要检查数字是否在给定的错误范围内。对于浮点数,这是f1==f2

答案 2 :(得分:0)

//
//  main.c
//
//
//  Created by myhaspl on 2018/10/22.
//   myhaspl@myhaspl.com.
//   https://dmyhaspl.github.io/
//

#include <stdlib.h>
#include <stdio.h>
char mytoken[10];
char* getCord(int placeOnArray, char mystr[80]){
    const char s[2] = " ";
    char str2[7];

    char* token=mytoken;
    for (int i=placeOnArray ;i<placeOnArray+7;i++){
        str2[i-placeOnArray]=mystr[i];
    }
    strcpy(mytoken,strtok(str2, s));
    printf("%s\n",mytoken);
    return mytoken;
}
int main(){
    char str[80] = "ATOM 1 N ASN A 1 -4.890 -12.296 -15.280 1.00 30.36 N";
    char* token=getCord(17,str);
    printf("%s\n",token);
    float number=atof(token);
    printf( "%f\n", number );
    return 0;
}

-4.890
-4.890
-4.890000