to_string()
-
@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/
-
@Alphavirus sagte in to_string():
Muss man mit include was einbinden?
Für
std::format
wäre das#include <format>
. Dafür muss der Compiler allerdings C++20 unterstützen und wenn er das tut, oft erstmal für diesen Sprachstandard konfiguriert werden. Bei GCC und Clang macht man das mit dem Compiler-Parameter-std=c++20
und bei MSVC/Visual Studio z.B. mit-std:c++latest
, bzw. stellt den Sprachstandard in den Projekteinstellungen der IDE ein (die sorgt dann dafür dass-std:c++latest
an den Compiler übergeben wird).Für
print
benötigt man#include <print>
und C++23 (mit-std=c++23
bei GCC/Clang aktivieren, falls unterstützt - nur sehr aktuelle Versionen).
Auch verwendet manstd::print()
nicht mitstd::cout
, sondern das steht für sich alleine:std::print("{:05}", n);
Diese Funktion gibt nämlich kein Objekt zurück, dass man über einen
std::ostream
mit<<
ausgeben kann, wie z.B. einenstd::string
, so wie esstd::to_string()
tut, sondern arbeitet direkt auf der Standardausgabe ("Text-Fenster").