Was hast du dir gedacht, was das %s darstellen soll?Code:az = strtof(%s,NULL); //kompilerfehler %s
%f ist der Platzhalter für ein double, nicht für ein float.Code:float x; ... printf("\ndas ist der float %f", x);//falscher Wert
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"); }
Was hast du dir gedacht, was das %s darstellen soll?Code:az = strtof(%s,NULL); //kompilerfehler %s
%f ist der Platzhalter für ein double, nicht für ein float.Code:float x; ... printf("\ndas ist der float %f", x);//falscher Wert
MfG
Stefan
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.
Auch %g ist für ein Double.Zitat von walterk
Zeige, was genau du probiert hast.und andererseits float durch double mit %f. Das Ergebnis war ebenso unrichtig wie vor dem ersten Post.
ptr zeigt auf den Teilstring, genau das ist schließlich der Zweck von strtok. Also:--> x = strtof(string, NULL); <--
Wie würdest du den betreffenden Teilstring hier hineinbringen?Code:x = strtof(ptr, NULL);
MfG
Stefan
Zeige, was genau du probiert hast.
Deine Ratschläge umgesetztCode: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; }
Und jetzt geht es, oder geht es nicht, oder was?Zitat von walterk
Und wenn nicht, dann zeige doch mal die Ausgabe.
MfG
Stefan
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.
Wenn du mit -Wall übersetzt, bekommst du nicht zufällig ein
" warning: implicit declaration of function 'strtof'"
oder?
MfG
Stefan
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?
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
Lesezeichen