从c中的字符串中提取double

时间:2012-12-04 08:04:09

标签: c floating-point double extract floating-point-conversion

我想在C中编写一个具有一个字符串参数的函数并返回一个双精度数。 例如,当字符串为fsldnf213414fasfa时,它应返回213414。 但它也应该能够将fasfasf123.412412fasfff之类的浮点数作为123.412412返回。

我已经有一个只能提取整数而不是浮点数的函数:

double get_num(const char* s) 
{
    unsigned int limit = UINT_MAX / 10;
    double value = 0;
    if ( !s ) {
        return 0;
    }
    for ( ; *s; ++s ) {
        if ( value < limit ) {
            if ( isdigit(*s) ) {
                value *= 10;
                value += (*s - '0');
            }
        }
        else {
            return UINT_MAX;
        }
    }
    return value;
}

5 个答案:

答案 0 :(得分:3)

首先跳过非数字,然后使用strtod将数字转换为double

double get_double(const char *str)
{
    /* First skip non-digit characters */
    /* Special case to handle negative numbers and the `+` sign */
    while (*str && !(isdigit(*str) || ((*str == '-' || *str == '+') && isdigit(*(str + 1)))))
        str++;

    /* The parse to a double */
    return strtod(str, NULL);
}

有关工作示例,请参阅here

答案 1 :(得分:2)

您可以检查它是否解析了任何字符串,而不是使用isdigit()或其他第二次猜测strtod():

char temp[] = "dgsgsd-3.5454dfds";

char *t1 = temp;
char *t2;
double d;

do
{
    if(*t1 == 0) return INVALID;
    d = strtod(t1, &t2);    
} while(t2 == t1++);

return d;

答案 2 :(得分:1)

for (; *s; s++) {
    if (!isalpha(*s)) {
        value = strtod(s, NULL);
        break;
    }
}

结果:

"fasfasf-123.412412fasfff"
"fasfasf+123.412412fasfff"
"fasfasf.123412412fasfff"

-123.412412
123.412412
0.123412

答案 3 :(得分:0)

希望能帮到你。

double stringtof(char *s) {
  int i = 0, j, k = 0;
  int llen = 0;

  llen = strlen(s);
  for (i = 0; i < llen; i++) {
    if (isdigit(s[i]) == 1) {
      break;
    }
  }

  char str2[llen - i];

  for (j = i; j < llen; j++) {
    str2[k] = s[j];
    k++;
  }
  // * val=atof(str2);
  return (atof(str2));
}

ideone

答案 4 :(得分:0)

扩展 @JasonD 使用 strtod() 的好主意。

完整的有效字符串包括以下内容以及其他一些可能的深奥实现特定字符串。

"123.45"
" 123.45"
"+123.45"
"-123.45"
".45"
"INF"  (or maybe INFINTY)
"NAN"
"123,45"  (when , is the locale decimal point
"123e45"
"0x123p45"

然而,断言数字字符串不需要以控制字符或空格开头是合理的。

可以小心使用is....()函数来拒绝像isgraph()这样的非初学者。

<块引用>

isgraph 函数测试除空格 (' ') 之外的任何打印字符。

#include <ctype.h>
#include <stdlib.h>

// Return fail flag.
int seek_double_in_string(double *dest, const char *s) {
  if (s) {
    // Perhaps allow seek_double_in_string(NULL, s) ?
    double dummy;
    if (dest == NULL) {
      dest = &dummy;
    }

    while (*s) {
      if (isgraph(*(unsigned char*)s)) {  // Use s as-if it was `unsigned char *`
        char *endtpr;
        *dest = strtod(s, &endptr);
        if (s != endptr) {
          // Some conversion occurred - pedantic code might want to detect overflow.
          return false; // no error
        }
      }
      s++;
    }
  }

  // Form a default answer if desired like 0.0 or NAN
  *dest = 0;
  return true;
}