只打印一个指向所需长度的指针

Udi*_*pta 0 c string pointers memcpy segmentation-fault

我有这样的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);


}
Run Code Online (Sandbox Code Playgroud)

我希望提供的键作为输入\"%s\"sprintf命令中标记的位置使用

输入:

  Key=qwerty
Run Code Online (Sandbox Code Playgroud)

输出:

 $cat akey
 qwerty
Run Code Online (Sandbox Code Playgroud)

和输出puts((char *)key)是 -

 qwerty?    

 // include newline character as well
Run Code Online (Sandbox Code Playgroud)

建议我这个,我尝试了这个(在代码中各自的位置),但得到 segmentation fault

    char *p;
    memcpy(p,(char *)key,keylen);
    puts((char *)p);
Run Code Online (Sandbox Code Playgroud)

tro*_*foe 5

您可以使用表单%.*s将其打印出来:

printf("%.*s\n", (int)keylen, (char *)key);
...
sprintf(sstring,"... %.*s ... ", ... (int)keylen, (char *)key ...);
Run Code Online (Sandbox Code Playgroud)

这里从提取维基百科条目printf:

宽度和精度格式化参数可以省略,或者它们可以是嵌入在格式字符串中的固定数字,或者在格式字符串中用星号"*"表示时作为另一个函数参数传递.例如printf("%*d",5,10)将导致打印"10",总宽度为5个字符,printf("%.*s",3,"abcdef")将导致"abc"正在印刷.

注意:使用8位类型(uint8_t)表示长度将字符串的长度限制为255个字符.更好的是使用size_t.