2011-10-25 19 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);