2

我想用 C 编写一个函数,它有一个字符串参数并返回一个双精度数。例如,当字符串是fsldnf213414fasfa它应该返回213414。但它也应该能够像fasfasf123.412412fasfffas一样返回浮点数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;
}
4

5 回答 5

4

首先跳过非数字,然后用于strtod将数字转换为 a 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);
}

有关工作示例,请参见此处。

于 2012-12-04T08:19:06.123 回答
3

您可以检查它是否解析了任何字符串,而不是使用 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;
于 2012-12-04T08:32:59.333 回答
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
于 2012-12-04T08:16:35.407 回答
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;
}
于 2021-01-03T23:58:23.077 回答
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

于 2021-01-03T22:46:25.803 回答