为了账号安全,请及时绑定邮箱和手机立即绑定

具有自动内存分配的sprintf()?

具有自动内存分配的sprintf()?

C
回首忆惘然 2019-12-04 09:45:39
我正在寻找一种类似sprintf()的实现,该实现会自动分配所需的内存。所以我想说char* my_str = dynamic_sprintf( "Hello %s, this is a %.*s nice %05d string", a, b, c, d );并且my_str检索保存此sprintf()结果的已分配内存的地址。在另一个论坛上,我读到可以这样解决:#include <stdlib.h>#include <stdio.h>#include <string.h>int main(){    char*   ret;    char*   a = "Hello";    char*   b = "World";    int     c = 123;    int     numbytes;    numbytes = sprintf( (char*)NULL, "%s %d %s!", a, c, b );    printf( "numbytes = %d", numbytes );    ret = (char*)malloc( ( numbytes + 1 ) * sizeof( char ) );    sprintf( ret, "%s %d %s!", a, c, b );    printf( "ret = >%s<\n", ret );    free( ret );    return 0;}但这在调用带有NULL指针的sprintf()时立即导致段错误。有什么想法,解决方案或提示吗?放置在公共域中的类似sprintf()的解析器的一个小实现就足够了,然后我自己完成它。非常感谢!
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

这是Stack Overflow的原始答案。正如其他人所说,你需要的snprintf不是sprintf。确保的第二个参数snprintf是zero。这将阻止snprintf写入NULL作为第一个参数的字符串。


需要第二个参数,因为它snprintf表明没有足够的空间可用于写入输出缓冲区。当没有足够的可用空间时,如果有足够的可用空间,则snprintf返回将要写入的字节数。


从这里的链接中复制代码...


char* get_error_message(char const *msg) {

    size_t needed = snprintf(NULL, 0, "%s: %s (%d)", msg, strerror(errno), errno) + 1;

    char  *buffer = malloc(needed);

    sprintf(buffer, "%s: %s (%d)", msg, strerror(errno), errno);

    return buffer;

}


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 602 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信