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
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 so342930
.
-
@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 so342930
.Bei
cout
weiß man nie so genau, was rauskommt! Vielleicht wurde in irgendeiner Funktion zuvor ja malstd::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 sogar01235622
raus.Also im Prinzip hat es also doch was mit
std::to_string
zu tun, dennstd::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
UNDoct
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 undsetw
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-) Projektestd::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 scope7 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?
-
@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/