【C++】vsnprintf的使用

 解释全在程序的注释里。

示例程序1:

//.c 程序

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

char msgbuf[80];

char *fmtmsg(char *format, ...)
{
	va_list arglist;

	va_start(arglist, format);
	strcpy(msgbuf, "Error: ");
	vsnprintf(&msgbuf[7], 80 - 7, format, arglist);		//从 msgbuf[7] 即 msgbuf 的第8个地址开始拼合,拼合 format 内容
	va_end(arglist);
	return(msgbuf);
}

int main(void)
{
	char *msg;

	msg = fmtmsg("%s %d %s", "Failed", 100, "times");
	printf("%s\n", msg);
	getchar();
	return 0;
}

 

 

示例程序2:

void pause(const char *str, ...){ }  子程序

声明要写在头文件 .h 里   extern void pause(const char *str, ...);

//.c 程序

/**
 * 暂停程序
 * @param  str  程序暂停时显示的字符串,可以包含格式控制符
 * @param  ...  变长参数
**/
void pause(const char *str, ...){		//程序也是用const 来写的,所以这个可能是2017的版本

	//首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
	va_list vl;		//VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数。
	
					
					//char *str[out], 把生成的格式化的字符串存放在这里.
	char buf[500] = {0};		//表示全部是0,可以认为是在初始化,后面 vsnprintf 直接截断 实参str 长度之后的数
	
	//然后用VA_START宏初始化刚定义的VA_LIST变量;
	va_start(vl, str);		//VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数)



	
	//size_t size[in], str可接受的最大字符数[1](非字节数,UNICODE一个字符两个字节), 防止产生数组越界.
	vsnprintf(buf, 500, str, vl);		//从buf 的第0个位置开始拼合


	//最后用VA_END宏结束可变参数的获取。
	va_end(vl);
	printf(buf);
	getch();
	printf("\n");
}

 

示例程序3:

//.c 程序

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
char *make_message(const char *fmt, ...)
{
	/* 初始时假设我们只需要不超过100字节大小的空间 */
	int n, size = 100;
	char *p;
	va_list ap;

	//如果不让分配空间
	//if 兼具 分配空间的功能
	if (  (p = (char *)malloc(size * sizeof(char))   ) == NULL)
		return NULL;



	//第一循环判定:当上面的程序成立时,继续执行,否则跳出while循环
	//第2 ... n次循环判定:上一次执行循环内的程序成立时,继续执行,否则跳出while循环
	while (1)		
	{
		/* 尝试在申请的空间中进行打印操作 */
		va_start(ap, fmt);
		n = vsnprintf(p, size, fmt, ap);		//n是所具有的大小 - 1
		printf("主程序实参的大小传入子程序中 n = %d( = 实际数据大小 - 1)\n", n);
		va_end(ap);
		/* 如果vsnprintf调用成功,返回该字符串 */
		if (n > -1 && n < size)	// 占满了size大小时 n = size - 1
			return p;
		/* vsnprintf调用失败(n<0),或者p的空间不足够容纳size大小的字符串(n>=size),尝试申请更大的空间*/
		size *= 2; /* 两倍原来大小的空间 */
		if ((p = (char *)realloc(p, size * sizeof(char))) == NULL)
			return NULL;
	}
}
int main()
{
	/* 调用上面的函数 */
	char* str = make_message("%d,%d,%d,%d", 5, 6, 7, 8);
	printf("%s\n", str);
	free(str);
	/* we allocate the memory in the make_message function, so we should release it by caller(main function). */
	getchar();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值