002
19.05.2003, 15:09 Uhr
virtual
Sexiest Bit alive (Operator)
|
Hm, habe noch nix in der FAQ dazugefunden, daher mal ein Vorschlag: bitte Kommentare + Verbesserungsvorschläge oder Alternativen:
Umwandeln Text -> Zahl
1. Möglichkeit - sscanf (ANSI C)
C++: |
#include <stdio.h>
int main() { char* text = "4711"; int zahl; int ret;
ret = sscanf(text, "%d", &zahl);
if (ret != 1) { /* Fehler */ } ... }
|
Bei sscanf wird als erstes Argument der Text übergeben, das zweite Argument enthält eine Formatangabe, mit der sscanf erkennt, in was denn der Text umgewandelt werden soll ("%d" bedeutet soviel wie int). Die folgenen Argument geben an, wohin das Resultat geschrieben werden soll. Dabei wird die Adresse der Variablen angegeben. sscanf ist auch in der Lage mehrere Dinge auf einmal umzuwandeln:
C++: |
int i; char[20] s; double d; sscanf(text, "%d - %s - %g", &i, s, &d);
|
Hier werden ein Integer, ein String und ein Double eingelesen, jeweils durch " - " getrennt. Ein vollständige Beschreibung der Möglichkewiten von sscanf würde den Rahmen des Artikels hier sprengen, daher soll es hier zunächst mal dabei belassen werden. Ein wichtiger Aspekt ist jedoch der Rückgabewert von sscanf: Er gibt an, wie viele Dinge von sscanf korrekt eingelesen wurden. Im obigen Beispiel könnte man als ret abfragen und wenn dieses 0 ist, dann war das einlesen nicht erfolgreich.
2. Möglichkeit - atoi (ANSI C)
C++: |
#include <stdlib.h>
int main() { char* text = "4711"; int zahl;
zahl = atoi(text); ... }
|
Diese Funktion erwartet als Argument den Text und gibt die zahl zurück. Diese Funktion ist jedoch icht in der lage, einen Fehlercoede zurückzuliefern. Wenn also in text Müll steht, dann auch in zahl und keiner merkt was.
3. Möglichkeit - strtoul (ANSI C)
C++: |
#include <stdlib.h>
int main() { char* text = "4711"; unsigned long zahl; char* err;
zahl = strtoul(text, &err, 10);
if (*err != 0) { /* Fehler */ } ... }
|
Diese Routine fällt etwas aus dem Rahmen, weil sie als Ergebnis ein unsigned long und kein int liefert. Sie erwartet als erste Argument den zu analysierenden Text. Im zweiten Argument wird ein Zeiger auf ein char* mitgeliefert, welches von strtoul auf das zeichen gesetzt wird, bis zu dem erfolgreich der Text analysiert wurde. Dh insbesondere in Obigen Beispiel: wenn err auf das terminierende Null byte von text zeigt, wurde der String korrekt eingelesen, sonst zeigt err auf das erste fehlerhafte Zeichen. Das letzte Argument gibt die Basis an, in der die Zahl in text gespeichert ist. hier ist jeder Wert zwischen 2 und 36 erlaubt, wobei 10 unser geliebtes Dezimalsystem ist). Als Rückgabe kommt die Zahl raus.
4. Möglichkeit - stringstream (ANSI C++)
C++: |
#include <sstream>
int main() { char* text = "4711; int zahl;
std::stringstream s(text); s>>zahl;
if(!s) { /* Fehler */ } ... }
|
Der Weg in der reinen C++ Lehre ist die Verwendung von String Streams. Man konstruiert zunächst einen StringStream mit dem gewünschten text und gibt dann den Inhalt in die Variablen aus, wohin wir sie wollen. Die Konvertoierung geht implizit. Der StreamStatus wird auf failed gesetzt, wenn was schief ging und dies kann man mit dem Operator ! abfragen. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 19.05.2003 um 15:10 Uhr von virtual editiert. |