Wie drucke ich eine nicht nullterminierte Zeichenfolge mit printf?

Lesezeit: 2 Minuten

Mikes Benutzeravatar
Mike

Wie kann ich mit printf eine nicht nullterminierte Zeichenfolge drucken, vorausgesetzt, ich kenne die Länge der Zeichenfolge zur Laufzeit?

  • Wenn es nicht nullterminiert ist, dann ist es per Definition kein String.

    – Keith Thompson

    4. August 2014 um 3:36 Uhr

  • es ist nur kein c-Stringda es in anderen Sprachen eine gültige Zeichenfolge wäre … und obwohl ein “nicht-nullterminiertes Array von Zeichen” genauer wäre, bin ich mir ziemlich sicher, dass es allgemein verstanden wurde.

    – Willdorf

    29. Juli 2016 um 19:58 Uhr


  • Mögliches Duplikat von Using printf with a non-nullterminated string

    – Emlai

    1. April 2017 um 19:06 Uhr

Benutzeravatar von kennytm
kennytm

printf("%.*s", length, string);

Zusammen mit anderen Argumenten verwenden:

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
//                         ^^^^                       ^^^^^^^^^^^^^^

In C könnte man mit dem die maximale Länge der Ausgabe angeben %.123s Format. Das heißt, die Ausgabelänge beträgt maximal 123 Zeichen. Das 123 könnte ersetzt werden durch *sodass die Länge dem Argument von printf entnommen wird, anstatt fest codiert zu sein.

Beachten Sie, dass dies davon ausgeht string enthält keine inneren Nullbytes (\0), da %.123s beschränkt nur die maximal Länge nicht die genau Länge, und Strings werden weiterhin als nullterminiert behandelt.

Wenn Sie eine nicht nullterminierte Zeichenfolge mit innerer Null drucken möchten, können Sie kein einzelnes printf verwenden. Verwenden fwrite stattdessen:

fwrite(string, 1, length, stdout);

Eine detaillierte Erklärung finden Sie in der Antwort von @MSDousti.

  • Hinweis: length Typ muss sein int hier, nach Standard-Argument-Promotions. Wenn dein length Variable ist etwas Größeres (zB size_t) sollten Sie es übertragen (int) Andernfalls wird Ihr Code auf einer Plattform beschädigt, auf der size_t ist breiter als int.

    – MM

    4. August 2014 um 4:25 Uhr

Benutzeravatar von MS Dousti
MS Dousti

Die Antwort von @KennyTM ist großartig, aber mit einer Subtilität.

Im Allgemeinen, wenn die Zeichenfolge nicht null “terminiert” ist, aber ein Nullzeichen in der Mitte hat, printf("%.*s", length, string); funktioniert nicht wie erwartet. Dies liegt daran, dass die %.*s Formatstring fragt printf drucken a maximal von length Zeichen, nicht exakt length Figuren.

Ich würde lieber die allgemeinere Lösung verwenden, auf die @William Pursell in einem Kommentar unter dem OP hingewiesen hat:

fwrite(string, sizeof(char), length, stdout);

Hier ist ein Beispielcode:

#include <stdio.h>

int main(void) {
    size_t length = 5;

    char string[length];
    string[0] = 'A';
    string[1] = 'B';
    string[2] = 0;        // null character in the middle
    string[3] = 'C';
    string[4] = 'D';

    printf("With printf: %.*s\n", length, string);
    printf("With fwrite: ");
    fwrite(string, sizeof(char), length, stdout);
    printf("\n");

    return 0;
}

Ausgabe:

With printf: AB
With fwrite: AB CD

  • sizeof (char) ist per definitionem 1. Ebenfalls, NULL ist speziell eine Null Zeiger Konstante.

    – Keith Thompson

    4. August 2014 um 3:37 Uhr


  • @KeithThompson, sizeof (char) ist semantischer. Ebenfalls, '\0' ist semantischer als 0. Aber wen interessiert es 😉

    – Ivan Schwarz

    12. Januar 2017 um 15:58 Uhr

  • Meine Ausgabe dafür ist With fwrite: AB – Es scheint am Nullterminator anzuhalten. Kompiliert mit gcc 4.8.5

    – Matthäus Moisen

    29. Februar 2020 um 17:08 Uhr

  • @MatthewMoisen: Siehe Godbolt-Ausgang für deinen Compiler.

    – MS Dousti

    29. Februar 2020 um 23:22 Uhr

1417580cookie-checkWie drucke ich eine nicht nullterminierte Zeichenfolge mit printf?

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

Privacy policy