Angenommen, Sie haben eine Zeichenfolge, die NICHT null
terminiert ist, und Sie kennen die genaue Größe. Wie können Sie diese Zeichenfolge printf
in C drucken ? Ich erinnere mich an eine solche Methode, kann sie aber jetzt nicht herausfinden ...
Angenommen, Sie haben eine Zeichenfolge, die NICHT null
terminiert ist, und Sie kennen die genaue Größe. Wie können Sie diese Zeichenfolge printf
in C drucken ? Ich erinnere mich an eine solche Methode, kann sie aber jetzt nicht herausfinden ...
Antworten:
Es gibt eine Möglichkeit mit printf, es geht so:
printf("%.*s", stringLength, pointerToString);
Sie müssen nichts kopieren, die ursprüngliche Zeichenfolge oder den ursprünglichen Puffer müssen nicht geändert werden.
printf
auch nach einem Jahrzehnt ... :)
printf
werden bis zu 11 Zeichen gedruckt oder bis NULL angezeigt wird , je nachdem, was zuerst eintritt . In Ihrem Beispiel steht NULL an erster Stelle. Wenn Sie eine maximale Länge angeben, verliert NULL nicht die Bedeutung für "Ende der Zeichenfolge" für printf
.
Hier finden Sie eine Erklärung, wie es %.*s
funktioniert und wo es angegeben ist.
Die Konvertierungsspezifikationen in einer printf-Vorlagenzeichenfolge haben die allgemeine Form:
% [ param-no $] flags width [ . precision ] type conversion
oder
% [ param-no $] flags width . * [ param-no $] type conversion
Die zweite Form dient zum Abrufen der Genauigkeit aus der Argumentliste:
Sie können auch eine Genauigkeit von '*' angeben. Dies bedeutet, dass das nächste Argument in der Argumentliste (vor dem tatsächlich zu druckenden Wert) als Genauigkeit verwendet wird. Der Wert muss ein int sein und wird ignoriert, wenn er negativ ist.
- Ausgabekonvertierungssyntax im glibc-Handbuch
Bei der %s
Formatierung von Zeichenfolgen hat die Genauigkeit eine besondere Bedeutung:
Es kann eine Genauigkeit angegeben werden, die die maximale Anzahl der zu schreibenden Zeichen angibt. Andernfalls werden Zeichen in der Zeichenfolge bis einschließlich des abschließenden Nullzeichens in den Ausgabestream geschrieben.
- Andere Ausgabekonvertierungen im glibc-Handbuch
Andere nützliche Varianten:
"%*.*s", maxlen, maxlen, val
rechtfertigt das Einfügen von Leerzeichen vor;"%-*.*s", maxlen, maxlen, val
wird links rechtfertigen."%-*.*s", padding, str_view.size(), str_view.data()
Sie können ein fwrite () verwenden, um zu stdout!
fwrite(your_string, sizeof(char), number_of_chars, stdout);
Auf diese Weise geben Sie die ersten Zeichen (in der Variablen number_of_chars definierte Nummer) in eine Datei aus, in diesem Fall in stdout (die Standardausgabe, Ihr Bildschirm)!
printf("%.*s", length, string)
wird nicht funktionieren.
Dies bedeutet, dass bis zu Längenbytes ODER ein Nullbyte gedruckt werden, je nachdem, was zuerst eintritt. Wenn Ihr nicht nullterminiertes Zeichenarray vor der Länge null Bytes enthält, stoppt printf auf diesen und fährt nicht fort.
#include<string.h>
int main()
{
/*suppose a string str which is not null terminated and n is its length*/
int i;
for(i=0;i<n;i++)
{
printf("%c",str[i]);
}
return 0;
}
Ich habe den Code bearbeitet, hier ist eine andere Möglichkeit:
#include<stdio.h>
int main()
{
printf ("%.5s","fahaduddin");/*if 5 is the number of bytes to be printed and fahaduddin is the string.*/
return 0;
}
C
Kontext sind alle Zeichenfolgen nullterminiert. Arrays von char ohne eine Null in ihnen sind keine Strings ... sie sind Arrays von char :)