转换的字符串在C双重可变(converting string to a double variabl

2019-06-23 11:51发布

我写了下面的代码....应该转换一个字符串,如“88”,以双精度值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 %f..what is the control string for double?
}



//input string :88

但它总是输出0 ...但是,当我修改RET的类型为int ...它工作正常...当类型为浮动或双,将打印零...所以为什么会出现这种不明确的结果?

Answer 1:

使用sscanf (标题stdio.hcstdio在C ++):

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

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

printf("%lf", d);


Answer 2:

但它总是输出0 ...但是,当我改变RET为int类型......它工作正常...当类型为float或double,它打印零。

逻辑是罚款。 只要您的格式说明是错误的。 将其更改为%f ,一切都很好!



Answer 3:

您也许能够ATOF()返回的双重使用。

资源



Answer 4:

您应该使用功能“ATOF”如果要分析一个char *将翻一番。

你也应该用分隔符“%F”打印双:

更多信息和使用示例,可以发现在这里。

使用示例:

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

int main()
{
   float val;
   char str[20];

   strcpy(str, "98993489");
   val = atof(str);
   printf("String value = %s, Float value = %f\n", str, val);

   strcpy(str, "tutorialspoint.com");
   val = atof(str);
   printf("String value = %s, Float value = %f\n", str, val);

   return(0);
}

要打印它,你必须打印为float:

printf("This is the value in float: %f\n", yourFloatValue);


Answer 5:

转换的字符串在C双重可变

如果溢出是不是一个问题,但代码要在数字文本之后检测的额外非空白文本:

// return 1 on success
int convertType(const char* value, double *destination) {
  char sentinel;
  return sscanf(value,"%f %c", destination, &sentinel) == 1;
}

如果sscanf()未能找到一个double的,返回值sscanf()EOF或0。

如果sscanf()数字文本后发现非空白文本,它将返回2。

如果只有一个double扫描,而无需额外的, sscanf()返回1开头和结尾的白色空间是确定。

例:

double x;
if (convertType(some_string, &x)) {
  printf("%.17e\n", x);  // or whatever FP format you like
} else {
  puts("Failed");
}


Answer 6:

#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));
    }
}


Answer 7:

下面的代码对我的作品。

#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);
}


文章来源: converting string to a double variable in C