2

文字列パラメーターを 1 つ持ち、倍精度の数値を返す関数を C で作成したいと考えています。たとえば、文字列がfsldnf213414fasfa返される場合は213414. fasfasf123.412412fasfffしかし、 asのような浮動小数点を返すこともできるはず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して数値を に変換します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 に答える