Warum macht er eine völlig falsche Ausgabe?



  • Also ich bin es noch einmal:

    Mein Code ist folgender:

    \Programm um Zeilenende der Ausgaben bündig zu setzen.

    #include <iostream>
    #include <iomanip>
    using namespace std;

    string spaces(string txt, int whlelength)
    {
    int length = txt.length(); \die Funktion gibt die Anzahl der Zeichen des Strings aus.
    string space = " "; \Spaces ist jetzt nur ein Leerzeichen.

    \\for-Schleife, damit space um so viele Zeichen erweitert wird, dass bei cout in der main alle Zeilen bis nach dem Aufruf von spaces gleichlang sind.
    \\Also Listeneinkaufspreis hat 19 Zeichen, also sollen mittels der for-Schleife noch 11 Leerzeichen angehängt werden, damit man auf insgesamt 30 Zeichen kommt, hinter denen dann die 250 steht.
    for(int cntr = whlelength - length; cntr <= whlelength; cntr++) \\Also ist der Zähler cntr = der Gesamtlänge whleLength - der Länge des inputStrings txt.
    {
        space += " ";
    }
    return space;
    

    }

    int main()
    {
    float listenp, rabatt, skonto, bk, hks, gkz, zek, bek, bp, hk, sk, gw,nvk, mw, bvk;

    cout << "Listeneinkaufspreis:" << spaces("Listeneinkaufspreis", 30) << "250" << endl; \\Text wird an obige Funktion gegeben.
    cout << "Rabatt (in %)" << spaces("Rabatt(in %)", 30) << "10" << endl; \\Jetzt wird hier an die Funktion der neue Text ausgegeben. Aber die Funktion gibt nicht die korrekte Zahl an Leerzeichen aus.
    
    return 0;
    

    }

    Was mache ich bloß falsch?



  • Ist etwas falsch?



  • @manni66

    Ach hi nochmal! 🙂

    Ja^^
    Er will nicht so wie ich, und ich sehe nicht wo der Fehler liegen soll.

    Hier nochmal der Code ohne Notizen:

    #include <iostream>
    #include <iomanip>
    using namespace std;

    string spaces(string txt, int whlelength)
    {
    int length = txt.length();
    string space = " ";

    for(int cntr = whlelength - length; cntr <= whlelength; cntr++)
    {
    space += " ";
    }
    return space;
    }

    int main()
    {
    float listenp, rabatt, skonto, bk, hks, gkz, zek, bek, bp, hk, sk, gw,nvk, mw, bvk;

    cout << "Listeneinkaufspreis:" << spaces("Listeneinkaufspreis", 30) << "250" << endl;
    cout << "Rabatt (in %)" << spaces("Rabatt(in %)", 30) << "10" << endl;

    return 0;



  • Ratschlag 1: benenne deine Variablen und Funktionen ordentlich (insbesondere sowas wie whlelength - Selbstlaute sind kostenlos auf deiner Tastaur zu haben, das e benutzt du ja auch!). Die Funktion sollte auch nicht spaces heißen, das ist viel zu unspezifisch.
    Ratschlag 2: Wenn dein String kürzer als die Gesamtlänge ist, brauchst du Gesamtlänge - Stringlänge Leerzeichen. Du kannst einen std::string mit n Leerzeichen direkt erzeugen: std::string(n, ' ') - siehe Konstruktor (2) hier: https://en.cppreference.com/w/cpp/string/basic_string/basic_string
    Du brauchst also nur diesen Leerzeichenstring vorne (oder hinten) anzuhängen.



  • Ach cool!
    Also macht diese Funktion im Prinzip das, was meine Funktion auch machen sollte?
    Also dass der zuerst die automatisch die Zeichen meines Strings zählt, und dann so viele Leerzeichen hinzufügt, dass n Zeichen in der Reihe stehen?



  • @JTR666 sagte in Warum macht er eine völlig falsche Ausgabe?:

    Ach cool!
    Also macht diese Funktion im Prinzip das, was meine Funktion auch machen sollte?

    Einen String mit n Leerzeichen macht das.

    Also dass der zuerst die automatisch die Zeichen meines Strings zählt, und dann so viele Leerzeichen hinzufügt, dass n Zeichen in der Reihe stehen?

    Nein.

    Mach doch lieber eine Funktion wie left_align:

    std::string left_align(const std::string &s, size_t len) {
         if (s.size() < len)
             return s + std::string(s.size() - len, ' ');
         return s;
    }
    

    Der einfache fertige Weg ohne eigene Funktion: schau dir mal den Header <iomanip> und https://en.cppreference.com/w/cpp/io/manip/setw an.



  • Dafür gibt es Manipulatoren, mit Hilfe derer Du bestimmen kannst, wie breit eine Ausgabe sein soll, ob sie links- oder rechtsbündig sein soll, und mit welchem Zeichen sie links (bei rechtsbündiger Ausgabe) aufgefüllt werden soll.



  • @Belli
    Kennst du welche? 🙂
    Ich schaue mir nämlich grad das Thema Formatierung im Terminal an, weswegen ich solche "lustigen" Fragen stelle...



  • @wob
    Was soll das "len" bedeuten?
    Und wieso referenzierst du s im Funktionskopf? 😃





  • @JTR666 sagte in Warum macht er eine völlig falsche Ausgabe?:

    Was soll das "len" bedeuten?

    len steht meistens für lenght.

    @JTR666 sagte in Warum macht er eine völlig falsche Ausgabe?:

    Und wieso referenzierst du s im Funktionskopf? 😃

    @wob lässt seine Funktion eine Referenz auf einen std::string nehmen damit nicht kopiert wird.


Log in to reply