Frage zu cin.get und newline



  • Ein cstring ist ein char array.
    Ein string ist ein eigener Datentyp von C++. siehe std::string

    beispiel 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+1
    

    bei 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' beendet

    Nein.
    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 cin als 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 oben
    

    Nein, 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 oben
    

    Dieser 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 oben
    

    Dieser 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. b ist ein Zeiger auf einen Zeichenkettenliteral, der tunlichst auf char const zeigen 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. b ist ein Zeiger auf einen Zeichenkettenliteral, der tunlichst auf char const zeigen 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 einlesen
    

    Wo 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 in buffer einlist, bis 79 Zeichen eingelesen sind, oder vorher ein '\n' eingelesen wird. Sollte noch bevor 79 Zeichen erreicht sind ein '\n' daherkommen, wird dieses Zeichen (im gegensatz zu getline ) nicht in buffer landen.

    Etwas Zwischen " und " ist ein Zeichenkettenliteral (string literal). Der Compiler hängt an einen Zeichenkettenliteral lt. Standard - Sone zitierte - eine Null an. Als int ist das eine 0 , als char ein '\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 *


Anmelden zum Antworten