仅打印出所需长度的指针

发布于 2024-12-11 19:13:22 字数 814 浏览 0 评论 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 命令中

输入:

  Key=qwerty

输出:

 $cat akey
 qwerty

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

 qwerty�    

 // include newline character as well

建议我这样做,我尝试过这个(在代码中各自的位置) 但出现分段错误

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

I hava a C function like this ..

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


}

I want the key provided as input to be used at the
place marked \"%s\" in sprintf command

Input :

  Key=qwerty

Output :

 $cat akey
 qwerty

and output of puts((char *)key) is -

 qwerty�    

 // include newline character as well

Suggest me on this , I tried with this (at their respective position in the code)
but getting segmentation fault

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

池予 2024-12-18 19:13:22

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

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

这里是 关于 printf 的维基百科条目

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

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

You could use the form %.*s to print it out:

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

Here an extract from the Wikipedia entry on printf:

The width and precision formatting parameters may be omitted, or they
can be a fixed number embedded in the format string, or passed as
another function argument when indicated by an asterisk "*" in the
format string. For example printf("%*d", 5, 10) will result in " 10"
being printed, with a total width of 5 characters, and printf("%.*s",
3, "abcdef") will result in "abc" being printed.

NOTE: Using an 8-bit type (uint8_t) to represent the length limits the length of the string to 255 characters. Better is to use size_t.

巨坚强 2024-12-18 19:13:22

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

You need to null-terminate your string (add a trailing '\0' byte) or use %ns (like "%.5s" for qwerty. Null termination is preferred.

小帐篷 2024-12-18 19:13:22

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

sprintf expects a 0-terminated string. That might not be the case in your application. With regard to using memcpy - you need to allocate memory first. Also make sure you check for errors, e.g. whether fk != NULL

Memory allocation example:

char *p = malloc(keylen + 1);
// check that p != NULL here
memcpy(p,(char *)key,keylen);
p[keylen] = 0;
puts((char *)p);
free(keylen);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文