【问题标题】:print out a pointer upto desired length only仅打印出所需长度的指针
【发布时间】:2011-10-25 12:13:24
【问题描述】:

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


}

我希望将作为输入提供的密钥用于 在sprintf 命令中标记\"%s\"

输入:

  Key=qwerty

输出:

 $cat akey
 qwerty

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

 qwerty�    

 // include newline character as well

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

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

【问题讨论】:

    标签: c string pointers segmentation-fault memcpy


    【解决方案1】:

    您可以使用%.*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

    【讨论】:

      【解决方案2】:

      您需要对字符串进行空终止(添加尾随 '\0' 字节)或使用 %ns(如 qwerty 的“%.5s”。首选空终止。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2013-10-29
          • 1970-01-01
          • 1970-01-01
          • 2017-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-27
          相关资源
          最近更新 更多