2012-04-09 3 views
9

J'ai écrit le code suivant .... Il devrait convertir une chaîne comme « 88 » à une double valeur 88 et l'imprimerchaîne conversion à une double variable 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 

Mais il imprime toujours 0. ..Mais quand je change de type de ret en int ... ça marche bien ... quand le type est flottant ou double, il imprime zéro ... alors pourquoi suis-je obtenir des résultats ambigus?

+1

Il n'y a pas une telle chose comme une chaîne en C de – Aidanc

+3

' "% f"' 'ou "% g'"(ou' "% e" 'pour le format exponentiel) est utilisé à la fois pour '(float)' et '(double)'. – geekosaur

+0

oubliez simplement le titre .. :) –

Répondre

17

Utilisez sscanf (en-tête stdio.h ou cstdio en C++):

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

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

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

qui est le fichier d'en-tête/ –

+0

'stdio.h' ou' cstdio' pour C++. – Hauleth

+1

Je ne suis pas d'accord que c'est une bonne réponse. Cela ne résout pas le problème, et il n'y avait rien de mal avec la boucle OP pour analyser une chaîne en double. – abelenky

2

Vous pourriez être en mesure d'utiliser atof() retourne un double.

source

+7

Faites-le 'strtod' et je peux upvote. –

+0

j'ai essayé atof et strtod() .. Les deux tirages 0 ... travaillé seulement lorsque le type de ret changé en int –

+0

@Jinu son pas le problème avec atof ou strtod. Vérifiez ma réponse –

3

Mais il imprime toujours 0 ... Mais quand je change le type de RET int ... il fonctionne très bien ... quand le type est flottant ou double, il imprime zéro.

La logique est bonne. Juste votre spécificateur de format est faux. Changez-le en %f et tout va bien!

-2

Le code suivant fonctionne pour moi.

#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

Ce n'est pas exactement pour donner une bonne réponse pour l'entrée '-.00314159E + 003', n'est-ce pas? –

-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

Vous devez utiliser la fonction "atof" si vous voulez analyser un char * doubler.

Vous devez également utiliser le séparateur "% f" pour imprimer le double:

Plus d'informations et exemple d'utilisation peuvent être trouvés here.

Exemple d'utilisation:

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

Pour imprimer il vous devez l'imprimer comme un flotteur:

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

La fonction 'atof' [ne semble pas fiable dans certains cas] (http://stackoverflow.com/a/7021778/975097), cependant. –

0

chaîne conversion à une double variable en C

Si le débordement est pas un problème, mais le code veut détecter supplémentaire texte non-blanc-espace après le texte numérique:

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

Si le sscanf() ne parvient pas à trouver un double, la valeur de retour de sscanf() sera être EOF ou 0.

Si le sscanf() trouve le texte non-blanc-espace après numer Si un double est numérisé, sscanf() renvoie 1. Les espaces blancs de début et de fin sont OK.

Exemple:

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