Was ist der richtige Weg, um printf zu verwenden, um ein size_t zu drucken?

Lesezeit: 3 Minuten

Was ist der richtige Weg um printf zu verwenden um
bradtgmurray

Size_t ist definiert als ein unsigned Ganzzahl, aber die Größe davon hängt davon ab, ob Sie sich auf einem 32- oder 64-Bit-Computer befinden. Was ist der richtige und tragbare Weg, um a size_t?

  • Mögliches Duplikat der plattformübergreifenden Formatzeichenfolge für Variablen vom Typ size_t?

    – Ciro Santilli Путлер Капут 六四事

    2. Oktober 2015 um 9:31 Uhr

  • @CiroSantilli六四事件法轮功纳米比亚威视 Ich lasse es offen, weil das Duplikat einige falsche Antworten enthält, während dieses eine gut akzeptierte Antwort hat.

    – edmz

    2. Oktober 2015 um 17:41 Uhr

  • @black Sie können auch vorschlagen, auf die andere Weise zu schließen. Beides ist für mich in Ordnung.

    – Ciro Santilli Путлер Капут 六四事

    2. Oktober 2015 um 18:53 Uhr


1647204008 645 Was ist der richtige Weg um printf zu verwenden um
JaredPar

Versuchen Sie es mit der %zu Zeichenfolge formatieren

size_t val = get_the_value();
printf("%zu",val);

Der z-Teil ist ein Längenbezeichner, der besagt, dass das Argument die Länge size_t haben wird.

Quelle – http://en.wikipedia.org/wiki/Printf#printf_format_placeholders

  • size_t ist ein vorzeichenloser Typ, daher müssen Sie weiterhin ‘u’ als Formattyp sowie den Längenmodifikator ‘z’ verwenden.

    – CB Bailey

    2. Juni 2009 um 15:20 Uhr

  • Außerdem ist der ‘z’-Modifikator eine C99-Ergänzung zu printf, also nicht unbedingt eine Standard-C++-Funktion.

    – CB Bailey

    2. Juni 2009 um 15:28 Uhr

  • @Charles hat den u-Teil korrigiert und ich habe am Anfang ein C-Tag hinzugefügt. Ich würde erwarten, dass dies viel mehr ein C-Feature als C++ ist, da C++ den Cout-Weg gehen kann.

    – JaredPar

    2. Juni 2009 um 15:48 Uhr

  • Mein Compiler (gcc) gibt eine Warnung aus: unknown conversion type character 'z' in format [-Wformat]|und wenn das Programm ausgeführt wird, wird es nur gedruckt zu als Ausgang

    – Eduard Karak

    1. September 2015 um 23:31 Uhr

  • @Ruslan Aus diesem Grund wurden Positionsargumente eingeführt. Siehe stackoverflow.com/questions/6322540/… . Wenn sie verwendet werden, ist Ihr Anliegen nicht zutreffend.

    – Keinstein

    12. Oktober 2017 um 14:35 Uhr


Es gibt ein C++-Tag dafür, also cout << ist eine weitere mögliche Antwort.

Dies ist überraschend schwer in allen Versionen von C richtig zu machen. In C90, Casting to unsigned long sollte funktionieren, aber das funktioniert möglicherweise nicht in C99, und die C99-Lösungen funktionieren nicht unbedingt in C90. Die Fähigkeit, zuverlässig zwischen C90 und C99 zu unterscheiden, wurde in den Änderungen von 1995 eingeführt (Festlegung der zulässigen Werte für __STDC__). Ich glaube nicht, dass es einen vollständig portablen Weg gibt, der für C90, C99 und C++ funktioniert, obwohl es Lösungen für jeden einzelnen davon gibt.

Ich denke, dass die C++-Antwort lautet:

std::size_t n = 1;
std::cout << n;

Für C-Style IO ist es etwas komplizierter. In C99 fügten sie die hinzu z Längenmodifikator für size_t Werte. Vor TR1 wird dies jedoch nicht unterstützt, sodass Sie nur noch auf eine bestimmte Größe umwandeln müssen, wie zum Beispiel:

std::size_t n = 1;
std::printf("%lu\n", static_cast<unsigned long>(n));

Dann wieder, unsigned long long wird sowieso nicht wirklich von C++ unterstützt, daher wird das obige seitdem gut funktionieren unsigned long ist der größte legale ganzzahlige Typ. Nach TR1 können Sie verwenden %zu sicher für size_t Werte.

  • Wie wird unsigned long long von C++ nicht unterstützt? Wenn Sie es auf die Größe stützen, die auf einigen Plattformen gleich ist, ist dies nicht dasselbe, als würde es nicht unterstützt. Wohlgemerkt, ich hatte eine sehr schlechte Reaktion auf C++ (auch wenn ich es scheußlich finde) und ich liebe C, aber ich bin noch keinem C++-Compiler begegnet, der unsigniert lange nicht unterstützt. Und sicherlich unterstützt es uint64_t.

    – Pryftan

    3. Dezember 2019 um 15:25 Uhr

998950cookie-checkWas ist der richtige Weg, um printf zu verwenden, um ein size_t zu drucken?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy