2011-10-25 48 views
0

我哈瓦C函數這樣的..打印出一個指針高達所需要的長度僅

func(uint8_t *key,uint8_t keylen) { 

FILE *fk; 
fk=fopen("akey","wb"); 
fwrite((char *)key,keylen,1,fk); 

puts((char *)key); // for testing 

fclose(fk); 

sprintf(sstring,"... \"%s\" ... ",(char *)key); 
     // ...other irrelevant stuff for here 
system(sstring); 


} 

我想作爲輸入提供的密鑰可以在 地方標記\"%s\"sprintf命令中使用

輸入:

輸出:

$cat akey 
qwerty 

puts((char *)key)輸出 -

qwerty�  

// include newline character as well 

建議我在此,我想用這個(在代碼中的各自位置) 但得到segmentation fault

char *p; 
    memcpy(p,(char *)key,keylen); 
    puts((char *)p); 

回答

5

你可以使用的形式%.*s打印出來:

printf("%.*s\n", (int)keylen, (char *)key); 
... 
sprintf(sstring,"... %.*s ... ", ... (int)keylen, (char *)key ...); 

這裏的提取物從Wikipedia entryprintf

的寬度和精度格式化參數可以被省略,或他們 可以是格式字符串中嵌入的固定數字,也可以作爲 格式字符串中由星號「*」指示的另一個函數參數傳遞。例如,printf(「%* d」,5,10)將導致打印出「10」 ,總寬度爲5個字符,而printf(「%。* s」, 3,「abcdef」)將導致打印「abc」。

:使用一個8位的類型(uint8_t)來表示長度限制了串到255個字符的長度。最好是使用size_t

+0

驚人的一個....甚至不聽到這個消息之前,感謝了很多! –

1

你需要以null結束你的字符串(添加一個尾隨的'\ 0'字節)或者使用%ns(比如「%.5s」)作爲qwerty。空終止是首選。

1

sprintf需要以0結尾的字符串。您的應用程序中可能不是這種情況。關於使用memcpy - 您需要先分配內存。同時請確保您檢查錯誤,例如是否fk != NULL

內存分配例如:

char *p = malloc(keylen + 1); 
// check that p != NULL here 
memcpy(p,(char *)key,keylen); 
p[keylen] = 0; 
puts((char *)p); 
free(keylen);