2012-04-09 4 views
9

ich den folgenden Code geschrieben haben .... Es sollte eine Zeichenfolge wie "88" auf den doppelten Wert 88 und ausdruckenString in einen double-Variable in C Umwandlung

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 

konvertieren Aber es druckt immer 0. ..Aber wenn ich den Typ von ret in int ändere ... funktioniert es gut ... wenn der Typ float oder double ist, gibt er null aus ... also warum bekomme ich diese mehrdeutigen Ergebnisse?

+1

Es gibt nicht so etwas wie ein String in C ;-) – Aidanc

+3

' "% f"' oder ' "% g'"(oder' "% e" 'für exponentielles Format) wird sowohl für (float) als auch für (double) 'verwendet. – geekosaur

+0

vergessen Sie einfach über den Titel .. :) –

Antwort

17

Verwenden sscanf (header stdio.h oder cstdio in C++):

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

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

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

Das ist die Header-Datei/ –

+0

'stdio.h' oder' cstdio' für C++. – Hauleth

+1

Ich stimme nicht zu, dass dies eine gute Antwort ist. Es löst das Problem nicht, und es gab nichts falsch mit OP-Schleife für die Analyse einer Zeichenfolge zu einem Doppel. – abelenky

2

Sie könnten in der Lage sein atof (zu verwenden) es gibt ein Doppelzimmer.

source

+7

Machen Sie es "strtod" und ich kann upvote. –

+0

ich versuchte atof und strtod() .. Beide Drucke 0 ... funktionierte nur, wenn der Typ von ret in int geändert –

+0

@Jinu ist nicht das Problem mit Atof oder Strtod. Überprüfen Sie meine Antwort –

3

Aber es druckt immer 0 ... Aber wenn ich Art von ret ändern int ... es funktioniert gut ... wenn der Typ float oder double ist, es Null druckt.

Logik ist in Ordnung. Nur dein Formatbezeichner ist falsch. Ändern Sie es in %f und alles ist gut!

-2

Der folgende Code funktioniert für mich.

#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

Das ist nicht unbedingt eine gute Antwort für den Eingang '-.00314159E + 003', oder? –

-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

Sie sollten die Funktion "atof" verwenden, wenn Sie einen char * zu verdoppeln analysieren möchten.

Sie sollten auch das Trennzeichen „% f“ verwenden, um die Doppel zu drucken:

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

Zum Drucken:

Weitere Informationen und Anwendungsbeispiel kann here.

Anwendungsbeispiel finden es müssen Sie es als ein Schwimmer drucken:

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

Die 'atof'-Funktion [scheint in einigen Fällen jedoch unzuverlässig zu sein] (http://stackoverflow.com/a/7021778/975097). –

0

String in ein double-Variable in C Umwandlung

Wenn Überlauf kein Problem ist, noch Code will zusätzlichen nicht-white-space Text nach dem numerischen Text erkennen:

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

Wenn die sscanf() nicht ein double, der Rückgabewert von sscanf() EOF oder 0

der Text nicht-white-space sscanf() findet nach numer Wenn sein finden ic text, wird es zurückgeben 2.

Wenn nur ein double gescannt wird, ohne extra, sscanf() gibt zurück 1. Führende und nachfolgende Leerzeichen sind in Ordnung.

Beispiel:

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