2013-03-13 49 views
6

所以我有一個字符串有一定數量的字節(或長度)。我說字節是因爲字符串末尾沒有NULL結束符。雖然,我知道弦多久。通常,我們都知道,當您printf("%s", str);時,它將繼續打印每個字節,直到它變爲NULL字符。我知道沒有C字符串不是NULL終止,但我有一個奇怪的情況,我存儲的東西(不是特定字符串),我不存儲NULL,但「東西」的長度。如何在字符串長度大於n時打印字符串前n個字節?

這裏是一個小例子:

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' 

我知道你被允許做這樣的事情:

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

但是,隨着這種情況下,我很難在編碼5,雖然與我的情況,5是在一個變量。我會這樣做:

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

但我知道你不能這樣做。但給你一個我想要完成的想法。

+0

一個非常類似的問題已經在這裏找到答案:http://stackoverflow.com/a/4777218/2163085 – Ninjammer 2013-03-13 04:02:22

+0

SO 4777218是相關的,但有點不同(主要是指分配而比打印)。 – 2013-03-13 04:16:24

+2

您可以使用'snprintf(format,sizeof(format),「%%。%ds」,len);'創建適當的格式字符串,然後在調用'printf()'時使用'format'。如果你正在執行'scanf()',如果輸入長度不同('scanf()'中的'*'與'printf()'中的'*')非常不同,那麼你實際上必須這樣做。 OTOH,'printf(「%。* s \ n」,len,str)'機制通常最適合'printf()'。 – 2013-03-13 04:18:53

回答

21

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

並且還沒有C字符串不是NULL終止。

+0

我知道沒有C字符串不是NULL終止,但我有一個奇怪的情況,我存儲的東西,我不存儲NULL,但「東西」的長度。 – 2013-03-13 03:59:45

+0

@RobAveryIV @RobAveryIV可以像上面那樣從'str'打印'len'字符串數量 – 2013-03-13 04:00:53

+0

請注意,這是因爲格式中的每個*都添加了另一個需要的參數,該參數被上面的'len'提供的整數值替換。 – 2013-03-13 04:01:27

1

你可以這樣做:

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

,它將打印它們在同一直線上,循環您需要打印任何lenght。

0

您可以像這樣檢測空字節中毒。計劃WIL顯示中毒空字節檢測

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"); 
    }