2013-03-13 9 views
6

Also habe ich eine Zeichenfolge, die eine bestimmte Anzahl von Bytes (oder Länge) hat. Ich sage Bytes, weil am Ende der Zeichenfolge kein NULL-Terminator steht. Allerdings weiß ich, wie lang die Saite ist. Normalerweise, wie wir alle wissen, wenn Sie printf("%s", str);, wird es weiterhin jedes Byte drucken, bis es ein NULL-Zeichen erhält. Ich weiß, dass es keine C-Zeichenfolge gibt, die nicht NULL-terminiert ist, aber ich habe eine merkwürdige Situation, in der ich Sachen (nicht speziell Zeichenfolgen) speichere und nicht die NULL, sondern die Länge der "Sache" speichere. obwohlWie drucke ich die ersten n Bytes, wenn die Länge der Zeichenfolge größer als n ist?

printf("%.5s", str); 

Aber mit dieser Situation, ich bin hart Codierung der 5, in: Hier

ist ein kleines Beispiel:

char* str = "Hello_World"; //Let's use our imagination and pretend this doesn't have a NULL terminator after the 'd' in World 
long len = 5; 

//Print the first 'len' bytes (or char's) of 'str' 

Ich weiß, dass es erlaubt ist, so etwas zu tun Mit meiner Situation ist die 5 in einer Variablen. Ich würde so etwas tun:

printf("%.(%l)s", len, str); 

Aber ich weiß, dass Sie das nicht tun können. Aber gibt dir eine Vorstellung davon, was ich zu erreichen versuche.

+0

Eine sehr ähnliche Frage hier beantwortet wurde: http://stackoverflow.com/a/4777218/2163085 – Ninjammer

+0

SO 4.777.218 verwandt ist, aber etwas anders (bezogen vor allem auf Zuordnung eher als Drucken). –

+2

Sie können 'snprintf (format, sizeof (format)," %%.% Ds ", len);' verwenden, um die entsprechende Formatzeichenfolge zu erstellen, und dann 'format' im Aufruf von' printf() 'verwenden. Wenn Sie 'scanf()' tun, müssen Sie dies praktisch tun, wenn die Eingangslängen variieren (das '*' in 'scanf()' unterscheidet sich sehr von dem '*' in 'printf()'). OTOH, der 'printf ("%. * S \ n ", len, str)' Mechanismus ist normalerweise am besten geeignet für 'printf()'. –

Antwort

21

printf("%.*s", len, str);

und auch gibt es keine C-String, der nicht NULL beendet.

+0

Ich weiß, dass es keine C-Zeichenfolge gibt, die nicht NULL terminiert ist, aber ich habe eine seltsame Situation, in der ich Sachen stopfe und nicht die NULL, sondern die Länge der "Sache" speichere. –

+0

@RobAveryIV Sie können 'len' Menge der Zeichenfolge von' str' wie oben –

+0

drucken Beachten Sie, dass dies funktioniert, da jedes * im Format ein weiteres erforderliches Argument hinzufügt, das durch den ganzzahligen Wert ersetzt wird, der von 'len' oben angegeben wird. –

1

Sie können dies tun:

for (int i =0; i<len; i++) 
{ 
    printf("%c", str[i]); 
} 

, die sie in der gleichen Zeile gedruckt wird, Looping für jede Art Länge Sie drucken müssen.

0

Sie könnten Null-Byte-Vergiftung wie folgt erkennen. Programm wil Anzeige Poisoning Null Byte erkannt

char filename[] = "path/image.php\0.bmp"; 

    if ((sizeof(filename) - 1) == strlen(filename)) { 

     printf("%s %s", "No poisoning Null Byte detected" , "\n"); 

     FILE *fp; 
     fp = fopen(filename, "r"); 

     if (fp == NULL) { 
     perror ("Unable to open the file"); 
     exit (1); 
     } 

     fread (buf, 1, sizeof buf, fp); 
     printf ("%s\n", buf); 

     fclose (fp); 

    } else { 
     printf("%s %s", "Poisoning Null Byte detected" , "\n"); 
    } 
Verwandte Themen