C语言动态分配内存实现字符串格式化拼接

这两天的C语言开发工作中用到了多次字符串格式化拼接,分享一下自己写的一个接口,动态分配内存,减少因缓冲区大小不够导致字符串被截断的烦恼

直接上代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>


int str_append_to_string(char **str, const char *fmt, ...) 
{
	int ret = 0;
    char *ptr = NULL;
    va_list args;
    int limit_size = 0;
    static int init_size = 256;
    static int use_size = 0;
    int size = 0;
    int append_ok = 0;

    if (fmt == NULL || strlen(fmt) <= 0)
    {
        printf("[%s:%d] param error\n", __FUNCTION__, __LINE__);
        return -1;
    }

    ptr = *str;
    if (ptr == NULL)
    {
        ptr = (char *)malloc(init_size * sizeof(char));
        if (ptr == NULL)
        {
            printf("[%s:%d] malloc failed\n", __FUNCTION__, __LINE__);
            return -1;
        }
        
        init_size = 256;
        use_size = 0;
        memset(ptr, 0, (init_size * sizeof(char)));
    }

    do
    {
        limit_size = init_size - use_size - 1;

        va_start(args, fmt);
        size = vsnprintf((ptr + use_size), limit_size, fmt, args);
        va_end(args);

        if (size > 0 && size <= limit_size)
        {
            use_size += size;
            append_ok = 1;
            continue;
        }

        // need more memory
        init_size += init_size >> 2;
		char *ptr_backup = ptr; // 备份ptr指针
        ptr = (char *)realloc(ptr, init_size * sizeof(char)); // realloc失败的话,ptr之前malloc的内存是不会被释放的
        if (ptr == NULL)
        {
            printf("[%s:%d] realloc failed\n", __FUNCTION__, __LINE__);
			ptr = ptr_backup; // 还原ptr指针
            ret = -1;
			break;
        }
    } while(!append_ok);

    *str = ptr;

    return ret;
}



int main(int argc, char*argv[])
{
	int ret = -1;
	char *string = NULL;
	ret = str_append_to_string(&string, "letters/%s/id_card/%d/name/%s", "ABC", 123, "Bob");
	if (ret == 0)
    {
		printf("string:%s\n", string);
	}
	
    if (string != NULL)
    {
		free(string);
		string = NULL;
    }

	return 0;
}

运行效果:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值