Verständnisproblem

andreas89

Grünschnabel
Code:
	char puffer[1000];

	cout << strlen(puffer) << endl;

	cin >> puffer;

	cout << strlen(puffer) << endl;

	cin.get();

Hallo, ich verstehe die Ausgabe dieses Codes nicht.
1. Ich lege doch ein Feld mit 1000 Zeichen an. Wieso zeigt die erste Ausgabe 1011 an ?
2. Wenn ich das Feld mit Werten belege, zeigt es mir die Länge des Wortes an. Wieso ?
Ich habe doch den Vektor nicht gekürzt, müsste der Vektor nicht immer noch 1000 Zeichen lang sein,
ich weiß zwar, dass der den Rest mit Nullen auffüllt, aber dennoch ist der doch 1000 Zeichen lang, oder liege ich da falsch ?
 
1. Ich lege doch ein Feld mit 1000 Zeichen an. Wieso zeigt die erste Ausgabe 1011 an ?
Das muss nicht notwendigerweise 1011 sein. Das kann alles mögliche sein. Denn du hast in deinem Programm nur mitgeteilt, dass du gedenkst, 1000 Bytes zu benutzen. Aufgeräumt hast du diese 1000 Bytes vor der ersten Benutzung nicht. D.h. dass weder irgendwelche \0 oder sonst etwas fest definiert in deinem puffer vorkommen. Tatsächlich liest der strlen() also fröhlich über den von dir angemeldeten Speicherbereich hinaus, bis er das erste Mal wirklich auf ein Nullbyte trifft.

2. Wenn ich das Feld mit Werten belege, zeigt es mir die Länge des Wortes an. Wieso ?
Weil strlen() so funktioniert.

Ich habe doch den Vektor nicht gekürzt, müsste der Vektor nicht immer noch 1000 Zeichen lang sein,
Vektor? Was für einen Vektor? Ich sehe da nur ein Character-Array. Der dir zur Verfügung stehende Speicherplatz für Bytes ist immer noch auf 1000 Zeichen beschränkt, aber strlen() zeigt dir nicht an, was sein könnte (also maximal 1000 Zeichen) sondern was ist - und das ist eben die Länge des von dir eingegebenen Wortes.

ich weiß zwar, dass der den Rest mit Nullen auffüllt,
Böser Trugschluß. Genau das passiert nämlich nicht!. Wenn du strcpy() oder cin verwendest, dann wird nur ein einziges \0 nach den Eingabewerten eingetragen. Der Rest deines Characterarrays ist nach wie vor undefiniert.

aber dennoch ist der doch 1000 Zeichen lang, oder liege ich da falsch ?
Der dir für den Puffer zur Verfügung stehende Speicherplatz ist 1000 Byte lang, ja.
Mit Nullbytes belegt ist dieser Speicherplatz nicht, nein.
Und wieviel Bytes du nun tatsächlich korrekt belegt hast - das wissen nur du, strlen() und das erste \0 im Characterarray.
 
CSANecromancer hat gesagt.:
Vektor? Was für einen Vektor? Ich sehe da nur ein Character-Array.

// klugschei ssmodus: an

Ein Array der Länge n in einer Programmiersprache entspricht einem Vektor in der Mathematik im R^n, von daher kann man die beiden Begriffe Vektor und Array völlig synonym verwenden.

// klugschei ssmodus: aus

Gruß,
RedWing
 
// klugschei ssmodus: an

Ein Array der Länge n in einer Programmiersprache entspricht einem Vektor in der Mathematik im R^n, von daher kann man die beiden Begriffe Vektor und Array völlig synonym verwenden.

// klugschei ssmodus: aus

Gruß,
RedWing
Gegengruß:
Na dann mach das mal deinem Compiler klar, dass der abstrakte Vektor, den du meinst, erstmal direkt nicht viel mit einem std::vector zu tun hat, sondern dass mit dem "mathematischen Vektor" ein pieselnormales Array gemeint ist.

Also - ich kenne die theoretischen Unterschiede und Definitionen und weiss, was du meinst.

Aber der Compiler...?
 
Gegengruß:
Na dann mach das mal deinem Compiler klar, dass der abstrakte Vektor, den du meinst, erstmal direkt nicht viel mit einem std::vector zu tun hat, sondern dass mit dem "mathematischen Vektor" ein pieselnormales Array gemeint ist.

Also - ich kenne die theoretischen Unterschiede und Definitionen und weiss, was du meinst.

Aber der Compiler...?

Darum geht es doch gar nicht.
1.) Wenn man einen "Vektor" anlegt dann wird sich der Compiler so oder so beschweren, egal was man nun damit meint.
2.) Sind wir hier doch unter Menschen, und wenn jemand schreibt er hat einen Vektor angelegt und im Code zu sehen ist das es sich bei dem Vektor um ein Array handelt dann sollte doch klar sein was gemeint ist, oder? Man muss da keine Haare spalten.

Gruß,
RedWing
 
Danke erstmal für die Erklärung und hey ich wollte nicht, dass ihr euch hier bekriegt.
Ich ging nunmal davon aus, dass ein array nur der englische Begriff für einen vekor ist.
Ich wusste nicht, dass es da so einen gravierenden Unterschied gibt, wie ihr den hier darstellt.

mfg andreas

Nur so am Rande - der zeigt immer 1011 an. Mag Zufall sein. Ich weiß es nicht.
 
Zuletzt bearbeitet:
Ach, keine Sorge, das ist kein Krieg.
Es ist nur, dass es unter C++ eben teils auch einen Datentyp vector gibt und da war ich etwas verwirrt. :) Das war schon alles.

Wegen der 1011:
Kommt natürlich drauf an, was du sonst noch so am Laufen hast. Ich hatte auch mal so einen Fall und dachte mir "ok, dann kriege ich halte eine fehlerhafte Anzeige, wird wohl nicht an mir liegen" und 99mal ging es gut. Beim 100. Mal verabschiedete sich dann Windows komplett.
 
OK. Wie kann man das, wie du schon sagtest bereinigen/aufräumen ? (falls das geht)

ich glaub' das wär eine Lösung:

Code:
	for(int i = 0; i<1001; i++)
	{
		puffer[i] = 0;
	}

nur muckt der Compiler dann rum.
 
Zuletzt bearbeitet:
Hmmm... ich würde den oberen Index eher auf < 1000 legen. Denn das Array wird von 0 bis 999 durchnummeriert, d.h. du kannst zwar auf puffer[1000] zugreifen, aber das ist nur eine Speicheradresse, die offiziell gar nicht mehr zu deinem Array gehört.
Code:
for(int i = 0; i < 1000; puffer[i++] = 0);
Ganz grob formuliert.

Aber wenn das Array als String verwendet werden soll (und Strings sind unter C++ immer mit einem Nullbyte (\0) abgeschlossen, zumindest erwarten das sämtliche Standard-Stringbefehle), dann tut's auch ein
Code:
puffer[0] = 0;
oder
Code:
strcpy(puffer, "");

Danach ist allerdings darauf zu achten, dass eben der Rest des Arrays nicht definiert ist. Lediglich mit Zugriff via Stringbefehle (strcpy, strcmp etc.) oder durch manuelles Abprüfen auf \0 kannst du sicherstellen, dass du nicht aus Versehen aus dem nicht vorbelegten Bereich des Arrays liest.
 
Zurück