Verständnissfrage bei dieser Funktion (Quellcode liegt bei)
-
Hallo zusammen!
Habe folgende Funktion in meinem C++ Buch (C++ lernen und professionell anwenden) gefunden. Verstehe aber den Befehl in der letzten Vorschleife nur zur Hälfte. Warum str[i] - '0' (Siehe Code) ???
Wäre nett, wenn ihr mir helfen könntet.Caipi
long strToLong(string str) { int i = 0; long vz = 1, zahl = 0; for(i = 0; i < str.size() && isspace(str[i]); i++) ; if(i < str.size()) { if(str[i] == '+') { vz = 1; i++; } if(str[i] == '-') { vz = -1; i++; } } for( ; i < str.size() && isdigit(str[i]); i++) { zahl = zahl * 10 + (str[i] - '0'); // Warum stri[i] - '0' ??? } return vz * zahl; }
-
das ist einfach eine primitive Art, ein char in einen String umzuwandeln, wenn alle Zahlen in einer Folge liegen und 0 der erste Teil dieser Folge ist
In ASCII sieht das ja so aus
'0' '1' '2' '3' '4' '5' '6' '7' '8' '9' 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 0x38 0x39
und wenn du dann ein Zeichen '3' hast und davon '0' abziehst (also 0x33-0x30) erhält man 3.
So einfach
-
Dann könnte ich doch das - '0' weglassen, oder? Wenn ich dies jedoch mache, kommt eine total andere Zahl heraus.
Beispiel: 13 wird ohne das - '0' zu 541.
Caipi
-
kingruedi schrieb:
das ist einfach eine primitive Art, ein char in einen String umzuwandeln, wenn alle Zahlen in einer Folge liegen und 0 der erste
? Das ist doch eine Schleife, die einen String (der eine Zahl repräsentiert) in eine Zahl umwandelt (hier long) [so lange, bis der String zu Ende ist oder eine erste Nichtzahl auftritt).
@Caipi: Du hast es noch nicht ganz verstanden. 13 lässt sich nicht als 1 ASCII Wert darstellen. Wenn ich die '2' in ASCII-Darstellung (!) habe, dann ist ihr Wert die 50 (siehe ASCII Tabelle) und wenn ich damit jetzt rechnen will, dann brauche ich den Wert 2. Also ziehe ich von 50 den Wert der '0' ab (48). 50-48=2
-
Jetzt hat es Klick gemacht
Vielen Dank für eure Antworten!!Caipi