2013-03-13 9 views
6

Tak więc mam ciąg znaków, który ma określoną liczbę bajtów (lub długość). Mówię bajty, ponieważ na końcu łańcucha nie ma żadnego NULL terminatora. Chociaż wiem, jak długi jest sznur. Normalnie, jak wszyscy wiemy, po printf("%s", str);, będzie drukować każdy bajt, aż do uzyskania znaku NULL. Wiem, że nie ma łańcucha C, który nie jest NULL zakończony, ale mam dziwną sytuację, w której przechowuję rzeczy (Nie konkretnie ciągi) i nie przechowuję NULL, ale długość "rzeczy".Jak wydrukować ciąg pierwszych n bajtów, gdy długość łańcucha jest większa niż n?

Oto mały przykład:

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' 

wiem, że mogą zrobić coś takiego:

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

Ale z tej sytuacji, jestem ciężko kodowania 5 w, choć w mojej sytuacji 5 jest zmienną. Zrobiłbym coś takiego:

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

Ale wiem, że nie możesz tego zrobić. Ale daje ci wyobrażenie o tym, co próbuję osiągnąć.

+0

Bardzo podobne pytanie zostało odebrane tutaj: http://stackoverflow.com/a/4777218/2163085 – Ninjammer

+0

SO 4777218 jest związane, ale nieco inaczej (odnosząc się głównie do przypisania raczej niż drukowanie). –

+2

Możesz użyć 'snprintf (format, sizeof (format)," %%.% Ds ", len);' aby utworzyć odpowiedni ciąg formatu, a następnie użyj 'format' w wywołaniu' printf() '. Jeśli robisz 'scanf()', praktycznie musisz to zrobić, jeśli długości wejściowe są różne ('' 'w' scanf() 'jest bardzo różne od' * 'w' printf() '). OTOH, mechanizm 'printf ("%. * S \ n ", len, str)' jest zwykle najbardziej odpowiedni dla 'printf()'. –

Odpowiedz

21

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

a także nie ma ciąg C, który nie jest NULL zakończone.

+0

Wiem, że nie ma łańcucha C, który nie jest NULL zakończony, ale mam dziwną sytuację, w której przechowuję rzeczy i nie przechowuję NULL, ale długość "rzeczy". –

+0

@RobAveryIV możesz wydrukować 'len' ilość łańcucha od' str' jak powyżej –

+0

Pamiętaj, że to działa, ponieważ każdy * w formacie dodaje kolejny wymagany argument, który jest zamieniany na wartość całkowitą podaną przez 'len' powyżej. –

1

Można to zrobić:

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

Które będzie drukować je w tej samej linii, niezależnie od długości pętli dla potrzebnych do wydrukowania.

0

W ten sposób można wykryć zatkanie bajtów o wartości null. wil Program wyświetlacz Zatrucie NUL wykryte

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"); 
    } 
Powiązane problemy