ein Kapitel zurück                                           ein Kapitel weiter

In diesem Kapitel will ich nochmals 5 weitere Funktionen durchnehmen die in der Headerdatei <stdlib.h> enthalten sind und als recht nützlich erwiesen haben. Zuerst 3 Funktionen zum Konvertieren eines Strings in numerische Werte....

double atof(char *string);
int atoi(char *string);
long int atol(char *string);  

In welchen Datentypen sich dabei ein String umwandeln lässt erkennen sie am Rückgabewert der Funktionen oder an der Endung der Funktion (ato[f]=float,double, ato[i]=integer, ato[l]=long). Wir wollen nun ein Programm schreiben das z.B. folgendende Eingabe in der Kommandozeile verarbeitet....

typen 5 5.55 A 255555 3E234
Als Ausgabe bekommen wir dann...
5 ist ein short int-Wert
Maximaler short int-Wert : 32767
Kleinster short int-Wert : -32768

5.55 ist ein float-Wert
Maximaler float-Wert : 340282346638528859820000000000000000000.000000
Kleinster pos. float-Wert : 0.000000

Konnte den Typ von A nicht ermitteln?!

255555 ist ein long-Wert
Maximaler long-Wert : 2147483647
Kleinster long-Wert : -2147483648

3E234 ist ein double-Wert
Maximaler double-Wert :
17976931348623157082000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000.000000
Kleinster pos. double-Wert : 0.000000  

Hierzu nun der Quellcode was man in etwa mit den Funktionen atol() und atof() machen kann....

/*Download:ato.c*/
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <float.h> #include <limits.h> int main(int argc, char **argv) { if(argc==1) { fprintf(stderr,"Keine Zahlen zum Auswerten vorhanden!\n"); exit(0); } while(*++argv) { if(strchr(*argv,'.')|| strchr(*argv,'e') ||strchr(*argv,'E')) { if(((atof(*argv))<=FLT_MAX)&&((atof(*argv))>=FLT_MIN)) { printf("\n%s ist ein float-Wert\n",*argv); printf("Maximaler float-Wert : %f\n",FLT_MAX); printf("Kleinster pos. float-Wert : %f\n",FLT_MIN); } else if(((atof(*argv))<=DBL_MAX)&&((atof(*argv))>=DBL_MIN)) { printf("\n%s ist ein double-Wert\n",*argv); printf("Maximaler double-Wert : %f\n",DBL_MAX); printf("Kleinster pos. double-Wert : %f\n",DBL_MIN); } } else if(((atol(*argv))<SHRT_MAX)&&((atol(*argv))>SHRT_MIN)&&(atol(*argv)!=0)) { printf("\n%s ist ein short int-Wert\n",*argv); printf("Maximaler short int-Wert : %d\n",SHRT_MAX); printf("Kleinster short int-Wert : %d\n",SHRT_MIN); } else if(((atol(*argv))<LONG_MAX)&&((atol(*argv))>LONG_MIN)&&(atol(*argv)!=0)) { printf("\n%s ist ein long-Wert\n",*argv); printf("Maximaler long-Wert : %ld\n",LONG_MAX); printf("Kleinster long-Wert : %ld\n",LONG_MIN); } else printf("\nKonnte den Typ von %s nicht ermitteln?!\n",*argv); } /*Ende while*/ return 0; }

Ich habe nicht auf alle Datentypen getestet und anderweitig ist das Programm auch nicht wasserdicht. Aber diese würde den Rahmen dieses Kapitels jetzt sprengen und dabei geht es uns nur um die Stringkonvertierung. Ich habe hier Konstanten aus den Headerdateien <float.h> und <limits.h> verwendet damit das Programm auch auf jedem System läuft. Egal welche Limits gesetzt sind.

Kommen wir zu weiteren Funktionen zu Konvertieren von Strings in numerischen Werten.....

double strtod(const char *string, char **endptr);  

...konvertiert einen String zu einem double-Wert. strtod bricht die Analyse beim ersten Zeichen ab, das nicht mehr als Teil eines double-Werts interpretiert werden kann. Solange der Parameter endptr nicht NULL ist, wird *endptr von strtod auf das Zeichen innerhalb von string gesetzt, durch das die Analyse abgebrochen wurde (*endptr = &abbruch_zeichen).



long strtol(const char *string, char **endptr, int basis);  

...konvertiert einen String in einen long - Wert. basis legt das Zahlensystem fest in das wir die Zahl umwandeln(basis=8 ist Oktalzahl, basis=16 (0-9,A-F) Hexdezimal, basis=10 ist Dezimalsystem). Für basis ist ein Wert von 2 bis 36 möglich. Für endptr können sie den NULL-Zeiger angeben. Falls sie keinen Null-Zeiger angeben zeigt endptr auf den Rest des long-Wertes (sollte einer übrig bleiben). Ein kurzes Beipiel von strtol()....

/*Download:strt.c*/
#include <stdio.h> #include <stdlib.h> int main() { char string[]= "256 Vorrat"; char string2[]= "128 Benoetigt"; long zahl; zahl=strtol(string,NULL,10)-strtol(string2,NULL,10); printf("Ergebniss : %ld\n",zahl); return 0; }

strtod ist übrigens äquivalent zu atof und strtol zu atoi und atol außer im Verhalten vom Fehlerfall.

Ein häufige Frage in Diskusionsforen lautet: Wo ist itoa oder wie kann ich Integerwerte in Strings konvertieren. Nun da itoa keine ANSI-C Standardfunktion ist, hängt es vom Compiler ab ob diese Funktion vorhanden ist oder nicht. Sollte man aber portabel bleiben wollen, macht diese Funktion sowieso keinen Sinn. Also basteln wir uns diese Funktion selber zusammen.........

/*Download:itoa.c*/
#include <stdio.h> #include <stdlib.h> /*wert ist der Integerwert; laenge ist die Anzahl der Zahlen des Integers wir benötigen Länge for die dynamische Speicherreservierung*/ char *it_oa(int wert, int laenge) { char *ret = malloc(laenge * sizeof(char)); int i; for(i=0; i<laenge; i++) { ret[laenge-i-1] = (wert % 10) + 48; wert = wert / 10; } ret[laenge]='\n'; return ret; } int main() { printf("%s\n", it_oa(1234,4)); printf("%s\n", it_oa(5432,6)); return 0; }

Im Falle das für Länge zuviel Zahlen angeben, werden diese mit voranstehenden Nullen gefüllt.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf