Wie kann ich mit printf eine nicht nullterminierte Zeichenfolge drucken, vorausgesetzt, ich kenne die Länge der Zeichenfolge zur Laufzeit?
Wie drucke ich eine nicht nullterminierte Zeichenfolge mit printf?
Mike
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 seinint
hier, nach Standard-Argument-Promotions. Wenn deinlength
Variable ist etwas Größeres (zBsize_t
) sollten Sie es übertragen(int)
Andernfalls wird Ihr Code auf einer Plattform beschädigt, auf dersize_t
ist breiter alsint
.– MM
4. August 2014 um 4:25 Uhr
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 als0
. 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
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