Problem beim output von Zahlen mit \n



  • Ich habe etwas Erfahrung in Java und bin dabei, C++ zu lernen.
    Dazu gucke ich mir einen Crashkurs auf Youtube an. Dort sind Programme verlinkt.
    In dem Programm Dev-C++ habe ich diese geöffnet.
    In einem habe ich mit \n herumprobiert. Dann ist mir aufgefallen, dass etwas komisch ist: die Ausgabe von Zahlen vor/nach einem \n.
    Entweder wiederholen sich die vorherigen Zeilen oder eine von den zwei Zahlen wird nicht angezeigt.
    kann mir jemand erklären, warum das so ist und wie ich das lösen kann (am besten, ohne die Zahlen in Gänsefüßchen zu setzen)?

    #include <iostream>
    
    using namespace std; //erspart std:: vor cout und weiteren Befehlen
    
    int main(void)
    {
        cout << "Erste Zeile." //kein ; Befehl geht also weiter
             << "Immer noch erste Zeile."
             << 7 +"\n"
             << 4
             << endl
             << "Zweite Zeile.\n";
    
        
        cin.get();
        return 0;
    }
    
    
    #include <iostream>
    
    using namespace std; //erspart std:: vor cout und weiteren Befehlen
    
    int main(void)
    {
        cout << "Erste Zeile." //kein ; Befehl geht also weiter
             << "Immer noch erste Zeile."
             << 7
             << "\n" +4
             << endl
             << "Zweite Zeile.\n";
    
        
        cin.get();
        return 0;
    }
    
    


  • Du addierst die 7 und das "\n". Letzteres ist ein const char Array. Somit bildest du die Summe aus einer Zahl und einer Adresse. Der Operator + hängt nicht beliebige Strings zusammen, sondern er addiert hier zwei Zahlen. Nimm statt Plus hier auch <<.

    Mit Plus probiere mal einen längeren String, z.B "hallo du\n" + 3) .



  • @wob Dann werden also beim addieren von strings und Zahlen Zeichen und \n's vom String abgezogen, oder? Und ich wollte auch noch fragen, ob dieses Programm ist, wie Du meinst.

    #include <iostream>
    
    using namespace std; 
    int main(void)
    {
        cout << 7
             <<"\n"
             << 4
             << endl
             << "Zweite Zeile.\n";
    
        
        cin.get();
        return 0;
    }
    


  • @MaxDerNeue sagte in Problem beim output von Zahlen mit \n:

    Dann werden also beim addieren von strings und Zahlen Zeichen und \n's vom String abgezogen, oder?

    Seltsame Frage ... man kann Strings und Zahlen einfach nicht addieren, genau genommen kann man nicht mal Strings addieren.
    Strings kann man aneinanderreihen, man kann also zum Beispiel einen String an einen anderen hinten anhängen.
    Für diese Aktion ist unter anderem in der Klasse std::string der Operator + überladen, um das einfach codieren zu können.
    Das hat aber überhaupt nicht das Geringste mit einer Addition zu tun.



  • @MaxDerNeue sagte in Problem beim output von Zahlen mit \n:

    @wob Dann werden also beim addieren von strings und Zahlen Zeichen und \n's vom String abgezogen, oder?

    Nein. Erst einmal: "\n" ist kein (std::)string, sondern ein const char[2] - ein Array von 2 chars, dem Zeilenumbruch und dem 0-Zeichen für das Ende. So ein Array kann immer auch in einen Pointer auf das erste Element zerfallen, d.h. die Adresse des ersten Zeichen. In C und C++ kann man zu Adressen Zahlen hinzuaddieren oder abziehen. Man bewegt sich dann so viele Schritte vorwärts/rückwärts wie im Array angegeben.

    Wenn du z.B. folgendes anguckst:

    #include <iostream>
    int main() {
        int x[] = {10, 20, 30};
    
        std::cout << x + 0 << '\n';
        std::cout << x + 1 << '\n';
        std::cout << x + 2 << '\n';
    
        std::cout << *(x + 0) << '\n';
        std::cout << *(x + 1) << '\n';
        std::cout << *(x + 2) << '\n';
    }
    

    Die ersten 3 Zeilen geben dir die Adresse des 0., des 1. und des 2. Elements im Array aus, die hinteren 3 Zeilen die dahinterstehenden Werte.

    Bei chars das fast das gleiche:

    #include <iostream>
    int main() {
        char x[] = {'a', 'b', 'c', '\0'};
    
        std::cout << x + 0 << '\n';
        std::cout << x + 1 << '\n';
        std::cout << x + 2 << '\n';
    
        std::cout << *(x + 0) << '\n';
        std::cout << *(x + 1) << '\n';
        std::cout << *(x + 2) << '\n';
    }
    

    Es gibt aber 2 wichtige Unterschiede:

    1. Wenn wir eine char-Adresse versuchen auszugeben, wird das als "Zeichenkette bis zum nächsten \0" interpretiert (und nicht die Adresse angezeigt).
    2. ...daher brauchen wir im Array ein '\0' am Ende.

    Versuche also mal, die Ausgaben der beiden Programme nachzuvollziehen!

    Und ich wollte auch noch fragen, ob dieses Programm ist, wie Du meinst.

    #include <iostream>
    
    using namespace std; 
    int main(void)
    

    Das void in den Klammern brauchst du nur in C. In C++ kann es weg.

    {
        cout << 7
             <<"\n"
             << 4
             << endl
    

    std::endl flusht auch (stellt sicher, dass sofort geschrieben wird). Du brauchst es in der Regel gar nicht, bzw nur, wenn du wirklich sicherstellen willst, dass geflusht wird. Ansonsten nimm einfach '\n'.



  • @wob kannst du mir erklären, was ein flush ist. Ich habe im internet gelesen, dass ein flush so etwas wie ein

    std::cin.sync()
    

    ist. Und bei deinem ersten Programm komm bei mir

    0x64ff10
    0x64ff14
    0x64ff18
    10
    20
    30
    

    raus. Das verstehe ich auch nicht so ganz. Es wäre nett, wenn du mir diese zwei Sachen erklären würdest.
    Danke im Vorraus

    • Max


  • @MaxDerNeue Ein flush schreibt die Daten aus dem Zwischenspeicher (Buffer) auf das Ausgabegerät.
    Das passiert normalerweise erst, wenn der Buffer voll ist.
    Bei manchen Geräten auch mit dem Zeilenende ('\n') oder sogar nach jedem Zeichen.
    Man kann das aber ändern.

    Es gibt auch die Funktion fflush(): https://en.cppreference.com/w/c/io/fflush

    Die Zahlen mit dem 0x davor sind die Adressen der Element vom Array.
    cout macht da einen Unterscheidet bei char (bzw. Zeiger auf char).
    Da dies meist einem C-String entspricht.
    Bei int hat man das nicht.


Anmelden zum Antworten