Verständnisfrage zu '0'
-
Also ist bei meinem Fall die "7" eigentlich eine 55 auf der ASCII-Tabelle. Und wenn ich 48 (also "0") abziehe, erhalte ich die "richtige" Zahl 7.
Danke für eure Hilfe!
-
Miness schrieb:
Also ist bei meinem Fall die "7" eigentlich eine 55 auf der ASCII-Tabelle. Und wenn ich 48 (also "0") abziehe, erhalte ich die "richtige" Zahl 7.
Danke für eure Hilfe!
du darfst einen String nicht mit einem Zeichen verwechseln:
'7' --> Zeichen --> 1Byte
"7" --> String --> 2Byte,wegen 0-Terminierungwas du meinst ist nämlich '7', joa und das ist laut ASCII 55 und davon ziehst 48 an dann landest bei 7
-
OK, danke!
Also:
7 = Zahl
'7' = Zeichen (1 Byte)
"7" = String (2 Byte)Oder?
-
Miness schrieb:
OK, danke!
Also:
7 = Zahl
'7' = Zeichen (1 Byte)
"7" = String (2 Byte)Oder?
richtig^^
"7" besteht nämlich aus '7' und '\0' darum 2byte
-
OK, dankeschön!
Warum ist denn aber eine String-Variable immer 4 Byte gross?
Da kann ich eigentlich ja soviele Zeichen speichern wie ich möchte, oder?
-
Miness schrieb:
OK, dankeschön!
Warum ist denn aber eine String-Variable immer 4 Byte gross?
Da kann ich eigentlich ja soviele Zeichen speichern wie ich möchte, oder?hä wie meinst du string-variable ?
das einzige was "immer" 4Byte belegt ist ein Zeiger.
die Zeichenkette belegt immer so viel Byte, wie groß sie eben ist.#include <iostream> using namespace std; int main() { char zeichenkette[11] = "0123456789"; // 11Byte cout << endl << sizeof(zeichenkette) << " Byte" << endl; char* zeiger_auf_zeichenkette = zeichenkette; cout << endl << sizeof(zeiger_auf_zeichenkette) << " Byte" << endl; system("pause>nul"); return 0; }Theoretisch kannst du so viele Zeichen in eine Zeichenkette packen wie du willst, aber praktisch geht dir irgendwann der Speicherplatz aus^^
-
Mit String-Variable meine ich das hier:
#include <iostream> #include <string> using namespace std; int main() { string test = "0123456789"; // 4 Byte cout << sizeof(test) << endl; }Und hier ist die Variable immer 4 Byte gross, egal wieviele Zeichen ich da rein packe... ^^
-
Liegt wahrscheinlich daran, dass
std::stringintern ebenfalls durch einen Zeiger (nämlichchar*) realisiert ist...EDIT: Ich hab den Code gerade in MSVC kopiert - bei mir gibt der grundsätzlich 32 und nicht 4 aus...
-
Ja, die Zeichen werden woanders gespeichert. "test" ist nur eine Art Verweis darauf.
-
Aha, alles klar! Vielen Dank!
EDIT: @daersc
Liegt wahrscheinlich am Compiler. Jeder Compiler interpretiert anders. Ich nutze den GCC GNU Compiler.
-
naja "string" ist kein primitiver Datentyp sondern eine Klasse (abstrakter Datentyp).
Der sizeof operator liefer immer den Speicherplatz, den der Datentyp verbraucht.
Wie der Datentyp "String" aufgebaut, ist weiß ich net aber er hat halt 4Byte.
Eventuell hat die Klasse ein "char*" Attribut ?!
-
Um an die Anzahl zu kommen, musst Du test.length() verwenden.
-
Ja, dann gibt der Compiler 10 Byte aus!
#include <iostream> #include <string> using namespace std; int main() { string test = "0123456789"; // 10 Byte cout << test.length() << endl; }Danke!
-
Dweb schrieb:
Wie der Datentyp "String" aufgebaut, ist weiß ich net aber er hat halt 4Byte.
Bei ihm. Was sizeof(string) ergibt kann man allgemein nicht sagen.
-
OK, ich kann mir aber auch gut vorstellen dass sizeof(string) nur die Grösse eines Zeiger ausgibt (siehe oben). Aber man weiss es nicht so wirklich... ^^
-
Miness schrieb:
OK, ich kann mir aber auch gut vorstellen dass sizeof(string) nur die Grösse eines Zeiger ausgibt (siehe oben). Aber man weiss es nicht so wirklich... ^^
Richtig, es wird wohl nur eine Art Handle sein (void*), aber verlassen kannst Du dich darauf nicht.
-
Miness schrieb:
Ja, dann gibt der Compiler 10 Byte aus!
string test = "0123456789"; // 10 Bytene, das was du ausgibst ist die länge der Zeichenkette, diese hat nix mit der Byteanzahl zu tun, du allokiert wird.
#include <iostream> using namespace std; int main() { char ar[] = "0123456789"; cout << sizeof(ar) << endl; // Byte cout << strlen(ar) << endl; // Länge system("pause>nul"); return 0; }
-
Funktioniert "strlen" gleich wie "VAR.length"?
-
beides gibt die länge der Zeichenkette zurück.
bei char[] muss man eben strlen verwenden.
bei string muss man length (glaub size gibts sogar auch noch)^^
-
OK, alles klar!
aber eigentlich trotzdem nicht logisch, denn "strlen" = "string length"... ^^