2012-04-09 25 views
9

He escrito el siguiente código .... Se debe convertir una cadena como "88" a doble valor 88 e imprimirloconvertir cadena a una variable doble en C

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 

Pero siempre imprime 0. ..Pero cuando cambio el tipo de ret a int ... funciona bien ... cuando el tipo es flotante o doble, imprime cero ... entonces ¿por qué estoy obteniendo estos resultados ambiguos?

+1

No hay tal cosa como una cadena en C ;-) – Aidanc

+3

' "% f" 'o' "% G'" (o ' "% e"' para el formato exponencial) se usa para '' (float) 'y' (double) '. – geekosaur

+0

simplemente olvídate del título ... :) –

Respuesta

17

Uso sscanf (cabecera stdio.h o cstdio en C++):

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

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

printf("%lf", d); 
+1

que es el archivo de encabezado/ –

+0

'stdio.h' o' cstdio' para C++. – Hauleth

+1

No estoy de acuerdo con que esta sea una buena respuesta. No resuelve el problema, y ​​no había nada de malo en el bucle de OP para analizar una cadena en un doble. – abelenky

2

que podría ser capaz de utilizar atof() devuelve un doble.

source

+7

Hazlo 'strtod' y puedo votar. –

+0

intenté atof y strtod() .. Ambas impresiones 0 ... funcionaron solo cuando el tipo de ret cambió a int –

+0

@Jinu no es el problema con atof o strtod. Compruebe mi respuesta –

3

Pero siempre imprime 0 ... Pero cuando cambio el tipo de ret a int ... es funciona bien ... cuando el tipo es float o double, imprime cero.

La lógica está bien. Solo su especificador de formato es incorrecto. ¡Cambie a %f y todo está bien!

-2

El siguiente código funciona para mí.

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

Esto no tiene exactamente para dar una buena respuesta para la entrada '-.00314159E + 003', ¿o sí? –

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

Debe utilizar la función "atof" si desea analizar un char * duplicar.

También debe utilizar el delimitador "% f" para imprimir la doble:

Más información y ejemplo de uso se pueden encontrar here.

Ejemplo de uso:

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

para imprimir debe imprimirlo como un flotador:

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

La función 'atof' [parece ser poco fiable en algunos casos] (http://stackoverflow.com/a/7021778/975097). –

0

convertir cadena a una variable doble en C

Si desbordamiento no es una preocupación, sin embargo, el código quiere detectar texto no blanco-espacio adicional después de que el texto numérico:

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

Si el sscanf() no logra encontrar un double, el valor de retorno de sscanf() se ser EOF ó 0.

Si el texto no sscanf() encuentra un espacio en blanco después de numer texto ic, devolverá 2.

Si solo se escanea double, sin costo adicional, sscanf() devuelve 1. Los espacios en blanco iniciales y finales son correctos.

Ejemplo:

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