Frage zu cin.get und newline
-
Hallo liebe Gemeinde.
Seit gestern beschäftige ich mich mit dem Thema Array.
In dem Buch, das ich verwende, ist folgendes Beispiel:
#include <iostream> using namespace std; int main() { char buffer[80]; cout << "Geben Sie einen String ein: "; cin.get(buffer,79) // Maximal 79 Zeichen oder bis newline einlesen cout << "Inhalt des Puffers: " << buffer << endl; return 0; }Nun zu meinen Fragen:
Wo müsste "newline" wie eingesetzt werden? Was bewirkt eigentlich newline?
Danke für die Antworten im Voraus.
Gruß
Max
-
Sicher, dass du newline meinst?
Am ende eines cstrings setzt man für gewöhnlich eine 0 ( '\0' ).
Damit zeigt man, dass das array, in dem Fall ein cstring zu ende ist.Hast du das mit newline gemeint?
-
Ja habe ich
-
Vllt noch einmal zum Verständnis:
Das '\0' setzt man NUR bei cstring, damit Funktionen wie strlen und co wissen wo das ende des string ist und dir z.B. die Länge ausgeben.
Bei anderen arrays z.B. int array oder sonst noch was, kannst du das ende des arrays nicht mit '\0' terminieren, dort musst du separat irgendwo die länge speichern.
-
akoww schrieb:
Das '\0' setzt man NUR bei cstring, damit Funktionen wie strlen und co wissen wo das ende des string ist und dir z.B. die Länge ausgeben.
Ok ... das habe ich vorher nicht gewusst.
Was meinst Du mit "cstring"??
Nur damit ich das richtig verstehe...
Normale Arrays: Länge wird vorher definiert
char Array: wird mit '\0' beendetHabe ich das richtig verstanden?
-
Ein cstring ist ein char array.
Ein string ist ein eigener Datentyp von C++. siehe std::stringbeispiel für char array
char a[] = "hallo welt"; // char array der länge 10+1 ( +1 ist das '\0' ) char *b = "hallo welt"; // wie oben char c[40] = "hallo welt"; // array größe von 40, aber text länge ist 10+1bei allen diesen Varianten wird nach dem letzten Zeichen automatisch ein '\0' gesetzt
nur bei cstring ist das '\0' relevant, bei allen anderen arrays nicht
-
Ok dank Dir, das hat mir sehr geholfen.
Dieses Forum ist einfach spitze...
-
silent_max schrieb:
Was meinst Du mit "cstring"??
Google: C-String
Damit meint man die Strings die man in C verwendet hat, und nicht eine Form von Tangas (wie im Web zu finden). Mit C-String ist ein Zeiger auf den ersten Buchstaben einer Zeichenkette im Speicher, bzw. diese Zeichenkette selbst gemeint. Der String geht dann offiziell bis zum nächsten im Speicher stehenden Terminierungszeichen (0).Normale Arrays: Länge wird vorher definiert
char Array: wird mit '\0' beendetNein.
char-Arrays sind auch nur ganz normale Arrays.
Bei C-Strings (hier meine ich die Zeichenketten im Speicher) wird, um das Ende zu signalisieren, ein Terminierungszeichen - '\0' (ASCII-Wert: auch 0) verwendet. Weil jedoch ein char-Array oft wie ein C-String behandelt wird (dank array-to-pointer decay zerfällt ein char-Array in einen Zeiger auf das erste Element, also einen C-String) wird oft als letztes Element im char-Array ein Terminierungszeichen gesetzt.Habe ich das richtig verstanden?
Nein. Dir fehlen massive Grundlagen.
Was haste für ein Buch?
akoww schrieb:
Vllt noch einmal zum Verständnis:
Das '\0' setzt man NUR bei cstring, damit Funktionen wie strlen und co wissen wo das ende des string ist und dir z.B. die Länge ausgeben.
Bei anderen arrays z.B. int array oder sonst noch was, kannst du das ende des arrays nicht mit '\0' terminieren, dort musst du separat irgendwo die länge speichern.
Ein C-String ist kein Array. Man signalisiert auch nicht das Ende eines C-Arrays mit '\0'. Ein C-Array kann auch hundert Terminierungszeichen enthalten.
akoww schrieb:
Sicher, dass du newline meinst?
Am ende eines cstrings setzt man für gewöhnlich eine 0 ( '\0' ).
Damit zeigt man, dass das array, in dem Fall ein cstring zu ende ist.Hast du das mit newline gemeint?
Du hast wohl auch nichts verstanden.
Die get()-Methode mit
cinals Objekt liest alles bis zum ersten newline, also bis du [Enter] drückst. Das ist damit gemeint.Ein cstring ist ein char array.
Falsch.
char a[] = "hallo welt"; // char array der länge 10+1 ( +1 ist das '\0' ) char *b = "hallo welt"; // wie obenNein, nicht wie oben. Der typ von a ist anders. Aber schön dass du erkannt hast, dass a kein C-String ist.
bei allen diesen Varianten wird nach dem letzten Zeichen automatisch ein '\0' gesetzt
Wäre noch schön, wenn du uns sagen könntest wieso genau.
-
Sone schrieb:
Dir fehlen massive Grundlagen.
Dito.
Du brabbelst irgend etwas vor dich hin, Sone.Den entscheidenden Punkt hast du nicht erwähnt.
char a[] = "hallo welt"; // char array der länge 10+1 ( +1 ist das '\0' ) char *b = "hallo welt"; // wie obenDieser Code ist nämlich falsch.
b ist ein Pointer auf ein String-Literal, das konstant ist. Es muss also richtig heissen:
char a[] = "hallo welt"; const char *b = "hallo welt"; // note the const!
-
trollkopf schrieb:
Den entscheidenden Punkt hast du nicht erwähnt.
char a[] = "hallo welt"; // char array der länge 10+1 ( +1 ist das '\0' ) char *b = "hallo welt"; // wie obenDieser Code ist nämlich falsch.
Der entscheidende Punkt? Willst du mich jetzt völlig veralbern? XD
-
.
-
h4x0r, wenn man keine Ahnung hat ... den Rest kennst du.
ISO/IEC 14882:2011(E) § 2.14.5 12) schrieb:
Whether all string literals are distinct (that is, are stored in nonoverlapping objects) is implementationdefined. The effect of attempting to modify a string literal is undefined.
Sone schrieb:
b ist ein Zeiger auf einen String, also ein C-String.
Dieser C-String enthält die Zeichen aus dem entsprechendem Literal.Quatsch mit Soße und Herumtänzelei.
bist ein Zeiger auf einen Zeichenkettenliteral, der tunlichst aufchar constzeigen sollte.Sone schrieb:
char-Arrays sind auch nur ganz normale Arrays.
[...]
Ein C-String ist kein Array.Ein cstring ist ein char array.
Falsch.
Sag' mal, wie nennst du Dinger, die sequentiell im Speicher liegen!?
Sone schrieb:
bei allen diesen Varianten wird nach dem letzten Zeichen automatisch ein '\0' gesetzt
Wäre noch schön, wenn du uns sagen könntest wieso genau.
Sag's du ihm doch!
-
Swordfish schrieb:
Quatsch mit Soße und Herumtänzelei.
bist ein Zeiger auf einen Zeichenkettenliteral, der tunlichst aufchar constzeigen sollte.Gut, ist weg.
Swordfish schrieb:
Sag' mal, wie nennst du Dinger, die sequentiell im Speicher liegen!?
"Dinger"?
Zeichen, die sequentiell liegen, nenne ich String.
-
Swordfish schrieb:
Sone schrieb:
bei allen diesen Varianten wird nach dem letzten Zeichen automatisch ein '\0' gesetzt
Wäre noch schön, wenn du uns sagen könntest wieso genau.
Sag's du ihm doch!
Na gut, hier.
§2.14.5 / 14
After any necessary concatenation, in translation phase 7 (2.2), ’\0’ is appended to every string literal so
that programs that scan a string can find its end.Also @TE: Jedes String-Literal ist Nullterminiert.
-
Zurück zum Thema:
silent_max schrieb:
cout << "Geben Sie einen String ein: "; cin.get( buffer, 79 ) // Maximal 79 Zeichen oder bis newline einlesenWo müsste "newline" wie eingesetzt werden? Was bewirkt eigentlich newline?
In diesem Beispiel musst du newline (Neue-Zeile-Zeichen, '\n') nirgends einsetzen.
Der Kommentar will dir sagen, daßcin.get()Zeichen inbuffereinlist, bis79Zeichen eingelesen sind, oder vorher ein'\n'eingelesen wird. Sollte noch bevor79Zeichen erreicht sind ein'\n'daherkommen, wird dieses Zeichen (im gegensatz zugetline) nicht inbufferlanden.Etwas Zwischen
"und"ist ein Zeichenkettenliteral (string literal). Der Compiler hängt an einen Zeichenkettenliteral lt. Standard - Sone zitierte - eine Null an. Alsintist das eine0, alscharein '\0'. Verändern darfst du Zeichenkettenliterale zur Programmlaufzeit nicht:char foo[] = "bla blabb"; // ein Array aus char, das vom Compiler mit dem Zeichenkettenliteral + [c]'\0'[/c] befüllt wird. foo[ 6 ] = 'u'; // ok. char *bar = "bla blabb"; // ein Zeiger auf char, Zeigt auf das erste Zeichen // des Zeichenkettenliterals bar[ 6 ] = 'u'; // Undefiniertes Verhalten -> dein Rechner dürfte mit Fug und // Recht in die Luft fliegen, eine Pizza bestellen, sonstwas.Darum deklariert man Zeiger auf Zeichenkettenliterale immer als Zeiger auf konstantes (nicht veränderbares) char:
char const *