-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Stringkonvertierung to Float

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103

    Stringkonvertierung to Float

    Anzeige

    Hallo Forum,

    mit dem Code eins möchte ich aus dem string die beiden Zahlenwerte als float herausknödeln. Die Forumssuche und mein 2kg/1000Seiten/1CD Buch c von A bis Z brachten leider nicht den erhofften Erkenntnisgewinn.

    Der String wird in //eins: in vier Teile zerlegt, bei der Umwandlung in float gibt //eins: einen Komilierfehler aus.

    Um den Fehler einzugrenzen, habe ich in //zwei: die Routine strtof explizit ausgeführt, hier wird der String in einen völlig anderen Wert umgewandelt.

    Umgebung: Fedora10+gcc

    Was mache ich da falsch?

    Danke für die Antworten.



    Code:
    #include <stdio.h>
    #include <string.h>
    
    //eins:
    
    int main (void){
    	char string[] = "AZ234.7 EL345.6";
    	int i = 1;
    	char *ptr;
    	float az, el;
    
    	ptr = strtok(string, "Z L");
    	while(ptr != NULL){
    
    		if(i == 2){
    			az = strtof(%s,NULL); //kompilerfehler %s
    			}
    
    		if(i == 4){
    			el = strtof(%s,NULL); //kompilerfehler %s
    			}
    
    		printf("%d. Wort: %s\n",i++,ptr);
    		ptr = strtok(NULL, " L");
    		}
    	return 0;
    	}
    
    //zwei:
    
    int main (void){
    
    	float x;
    	char string[] = "341.9";
    	x = strtof(string, NULL);
    	printf("\ndas ist der float %f", x);//falscher Wert
    	printf("\n");
    	}

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
    az = strtof(%s,NULL); //kompilerfehler %s
    Was hast du dir gedacht, was das %s darstellen soll?

    Code:
       float x;
    ...
       printf("\ndas ist der float %f", x);//falscher Wert
    %f ist der Platzhalter für ein double, nicht für ein float.
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Hallo sternst,

    danke für deine Antwort.

    Habe einerseits %f durch %g mit float ersetzt und andererseits float durch double mit %f. Das Ergebnis war ebenso unrichtig wie vor dem ersten Post.

    Was schlägst du vor?

    Der Platzhalter %s wurde bereits durch den Kompiler beanstandet.

    --> x = strtof(string, NULL); <--

    Wie würdest du den betreffenden Teilstring hier hineinbringen?
    Gibt es hier eine fertige Bibliotheksfunktion oder ist eine for-Schleife und eine Indexvariable das Mittel der Wahl?

    Danke für die Antworten.

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von walterk
    Habe einerseits %f durch %g mit float ersetzt
    Auch %g ist für ein Double.
    und andererseits float durch double mit %f. Das Ergebnis war ebenso unrichtig wie vor dem ersten Post.
    Zeige, was genau du probiert hast.

    --> x = strtof(string, NULL); <--

    Wie würdest du den betreffenden Teilstring hier hineinbringen?
    ptr zeigt auf den Teilstring, genau das ist schließlich der Zweck von strtok. Also:
    Code:
    x = strtof(ptr, NULL);
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Zeige, was genau du probiert hast.

    Code:
    int main (void){
    	char string[] = "AZ234.7 EL345.6";
    	int i = 1;
    	char *ptr;
    	double az, el;
    
    	ptr = strtok(string, "Z L");
    	while(ptr != NULL){
    
    		if(i == 2){
    			az = strtof(ptr,NULL);
    			}
    		printf("Der %d. Wert ist %f.\n",i,az);
    
    		if(i == 4){
    			el = strtof(ptr,NULL);
    			}
    		printf("Der %d. Wert ist %f.\n",i,el);
    
    		printf("%d. Wort: %s\n",i++,ptr);
    		ptr = strtok(NULL, " L");
    		}
    	return 0;
    	}
    Deine Ratschläge umgesetzt

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von walterk
    Deine Ratschläge umgesetzt
    Und jetzt geht es, oder geht es nicht, oder was?
    Und wenn nicht, dann zeige doch mal die Ausgabe.
    MfG
    Stefan

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Hallo sternst,

    dies ist die Ausgabe des Codes von oben. Statt der langen Ganzzahl habe ich die Werte von Wort 2 und 4 erwartet. Die langen Ganzzahlen machten auf mich den Eindruck einer Speicheradresse. Nach Änderungen im Bereich Pointer gabs Kompilerfehlermeldungen.

    Ausgabe Code von oben:

    <ausgabe>
    Der 1. Wert ist 0.000000.
    Der 1. Wert ist 0.000000.
    1. Wort: A
    Der 2. Wert ist 1124073472.000000.
    Der 2. Wert ist 0.000000.
    2. Wort: 234.7
    Der 3. Wert ist 1124073472.000000.
    Der 3. Wert ist 0.000000.
    3. Wort: E
    Der 4. Wert ist 1124073472.000000.
    Der 4. Wert ist 1132462080.000000.
    4. Wort: 345.6
    </ausgabe>

    Danke für deine Mühe.

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Wenn du mit -Wall übersetzt, bekommst du nicht zufällig ein
    " warning: implicit declaration of function 'strtof'"
    oder?
    MfG
    Stefan

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2009
    Beiträge
    103
    Ja, genau so ist es.

    Zusätzlich zu den beiden includes stdio.h und string.h habe ich nun auch strings.h und stdlib.h verwendet, leider keine Änderung des Verhaltens.

    Was schlägst du vor?

  10. #10
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    strtof gehört zu stdlib.h, aber erst seit C99. Zusätzlich zum Inkluden von stdlib.h musst du also auch noch den vom Compiler benutzten Standard richtig setzen, also entweder "--std=c99" oder "--std=gnu99" benutzen.
    MfG
    Stefan

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •