18

私は次のコードを書きました。"88"のような文字列をdouble値に変換して出力する必要が88あります

void convertType(char* value)
{
   int i = 0;
   char ch;
   double ret = 0;
   while((ch = value[i])!= '\0')
   {
      ret = ret*10 + (ch - '0');
      i++;
   }
   printf("%d",ret); //or %lf..
}

// input string :88

ただし、常に印刷され0ます。しかし、retのタイプをに変更するとint、正常に機能します。タイプがfloatまたはの場合double、。を出力し0ます。では、なぜこれらのあいまいな結果が得られるのでしょうか。

4

8 に答える 8

30

使用sscanf(ヘッダーstdio.hまたはcstdioC ++):

char str[] = "12345.56";
double d;

sscanf(str, "%lf", &d);

printf("%lf", d);
于 2012-04-09T15:13:10.810 に答える
4

あなたはatof()を使うことができるかもしれませんそれはdoubleを返します。

ソース

于 2012-04-09T15:13:32.573 に答える
4

しかし、常に0を出力します...しかし、retのタイプをintに変更すると...正常に動作します...タイプがfloatまたはdoubleの場合、ゼロを出力します。

ロジックは問題ありません。フォーマット指定子だけが間違っています。に変更すると%f、すべて問題ありません。

于 2012-04-09T15:16:41.500 に答える
-2
#define ZERO 48
#define NINE 57
#define MINUS 45
#define DECPNT 46

long strtolng_n(char* str, int n)
{
    int sign = 1;
    int place = 1;
    long ret = 0;

    int i;
    for (i = n-1; i >= 0; i--, place *= 10)
    {
        int c = str[i];
        switch (c)
        {
            case MINUS:
                if (i == 0) sign = -1;
                else return -1;
                break;
            default:
                if (c >= ZERO && c <= NINE) ret += (c - ZERO) * place;
                else return -1;
        }
    }

    return sign * ret;
}

double _double_fraction(char* str, int n)
{
    double place = 0.1;
    double ret = 0.0;

    int i;
    for (i = 0; i < n; i++, place /= 10)
    {
        int c = str[i];
        ret += (c - ZERO) * place;
    }
    return ret;
}
double strtodbl(char* str)
{
    int n = 0;
    int sign = 1;
    int d = -1;
    long ret = 0;

    char* temp = str;
    while (*temp != '\0')
    {
        switch (*temp)
        {
            case MINUS:
                if (n == 0) sign = -1;
                else return -1;
                break;
            case DECPNT:
                if (d == -1) d = n;
                else return -1;
                break;
            default:
                if (*temp < ZERO && *temp > NINE) return -1;
        }
        n++;
        temp++;
    }

    if (d == -1)
    {
        return (double)(strtolng_n(str, n));
    }
    else if (d == 0)
    {
        return _double_fraction((str+d+1), (n-d-1));
    }
    else if (sign == -1 && d == 1)
    {
        return (-1)*_double_fraction((str+d+1), (n-d-1));
    }
    else if (sign == -1)
    {
        ret = strtolng_n(str+1, d-1);
        return (-1) * (ret + _double_fraction((str+d+1), (n-d-1)));
    }
    else
    {
        ret = strtolng_n(str, d);
        return ret + _double_fraction((str+d+1), (n-d-1));
    }
}
于 2013-09-12T11:42:05.457 に答える
-2

次のコードは私にとってはうまくいきます。

#include <stdio.h>

void convertType(char* value);

int main(int argc, char *argv[]) {
    char *str="0929";
    convertType(str);

    return  0;
}

void convertType(char* value) {
    double ret = 0;

    while(*value != '\0') {
        ret = ret*10 +(*value - '0');
        value++;
    }

    fprintf(stdout, "value: %f\n", ret);
}
于 2012-04-09T17:22:19.083 に答える