to_string()



  • Mojn Leute
    Ich hab nur eine kurze Frage zu folgendem Code:

    	int n = 01235622;
    	cout << to_string(n);
    

    Warum kommt da 342930 raus und nicht 01235622? Wenn man die Null vorweg weglässt geht es.
    Gibt es dafür eine Lösung?
    Danke



  • Ganzzahlen mit 0 vorne werden als Oktalzahlen interpretiert. Zur Basis 8. Also so ähnlich wie Hexadezimalzahlen mit 0x vorne, nur dass die zur Basis 16 sind.

    Deswegen geht auch 08 oder 09 nicht.

    Also zum Beispiel:

    070 = 56 = 0x38

    070=7×81+0×80070 = 7 \times 8^1+0 \times 8^0
    56=5×101+6×10056 = 5 \times 10^1+6 \times 10^0
    0x38=3×161+8×1600\text{x}38 = 3 \times 16^1+8 \times 16^0

    PS: die Frage hat nichts mit to_string zu tun.



  • @wob sagte in to_string():

    PS: die Frage hat nichts mit to_string zu tun.

    Genau, auch cout << n; ergibt so 342930.



  • @Th69 sagte in to_string():

    @wob sagte in to_string():

    PS: die Frage hat nichts mit to_string zu tun.

    Genau, auch cout << n; ergibt so 342930.

    Bei cout weiß man nie so genau, was rauskommt! Vielleicht wurde in irgendeiner Funktion zuvor ja mal std::oct verwendet?

    std::cout << std::oct; // <-- irgendwo vorher im Code
    int n = 01235622;
    std::cout << n << '\n';
    

    Gibt 1235622 aus.

    Und wenn man noch std::cout << std::showbase; einfügt, kommt sogar 01235622 raus.

    Also im Prinzip hat es also doch was mit std::to_string zu tun, denn std::to_string verwendet immer das Dezimalsystem.



  • Moin
    Also
    cout << oct;
    funktioniert.
    cout << showbase geht nicht.
    Bei folgendem Code:

    #include <iostream>
    using namespace std;
    
    int main () {
    	int n = 01234;
    	cout << showbase;
    	cout << n;
    }
    

    krieg ich 668 raus.



  • Du brauchst showbase UND oct für die führende 0 der Oktalbasis.



  • Stimmt. Das geht.
    Nur aus Interesse, gibt es auch eine Möglichkeit, eine Zahl mit mehreren führenden Nullen vorweg auszugeben?



  • Schau dir das Beispiel zu setfill an (statt '*' gibst du dann '0' an).



  • @Alphavirus sagte in to_string():

    Stimmt. Das geht.
    Nur aus Interesse, gibt es auch eine Möglichkeit, eine Zahl mit mehreren führenden Nullen vorweg auszugeben?

    Ja, bei Streams aus der Standardbibliothek wie cout einer ist, lässt sich sowas mithilfe sog. Manipulatoren bewerkstelligen, die an der jeweiligen Stelle während der Ausgabe den Stream entsprechend umkonfigurieren:

    cout << setfill('0') << setw(5) << n;
    

    setfill konfiguriert das gewünschte Füllzeichen und setw die minimale Ausgabelänge z.B. für solche Zahlen. Bedenke, dass das Parameter sind, die im Stream gespeichert werden: Sie gelten nicht nur für die nächste Zahl, sondern für alle folgenden - bis der Stream wieder umkonfiguriert wird.

    Als Neuling solltest du auch wissen, dass es für solche Formatierungen mittlerweile eine modernere Alternative gibt, da die in der Praxis immer etwas klobig in der Anwendung waren. Ab C++20 gibt es std::format und ab C++23 std::print. Damit sähe das dann z.B. so aus:

    std::cout << std::format("{:05}", n);
    

    oder

    std::print("{:05}", n);
    

    Siehe auch hier, wie damit Formatierungen spezifiziert werden.

    Du solltest cout-Formatierungen kennen (viel existierender Code verwendet das), aber wenn du Zugriff auf moderneres C++ hast, würde ich für eigene (Übungs-) Projekte std::format/std::print empfehlen. Die C++-Community ist eh schon extrem lahmarsching, was Neuerungen angeht, da kann man als Anfänger ruhig ein bisschen frischen Wind reinbringen 😉



  • Also Danke erstmal.
    Ich krieg das allerdings nicht zum laufen.
    Der Code:

    #include <iostream>
    using namespace std;
    
    int main () {
    	int n = 005223;
    	cout << setfill('0') << setw(5) << n;
    	cout << format("{:05}", n);
    	cout << print("{:05}", n);
    }
    

    Die Fehlermeldungen:
    7 10 C:\Users\User\Documents\C++\Test\test.cpp [Error] 'setfill' was not declared in this scope

    7 26 C:\Users\User\Documents\C++\Test\test.cpp [Error] 'setw' was not declared in this scope; did you mean 'getw'?

    8 10 C:\Users\User\Documents\C++\Test\test.cpp [Error] 'format' was not declared in this scope

    Muss man mit include was einbinden?


  • Mod

    @Alphavirus sagte in to_string():

    Muss man mit include was einbinden?

    Ja, iomanip. Eine der wichtigsten Sachen beim Lernen von C++ ist, solche Fragen selber beantworten zu können. Abgesehen vom offensichtlichen Google "C++ setfill" kann ich nur empfehlen, dir eine gute Referenz zu suchen. Zwei der größten und besten sind cppreference.com und CplusPlus.com:
    https://en.cppreference.com/w/cpp/io/manip/setfill
    https://cplusplus.com/reference/iomanip/setfill/


Anmelden zum Antworten