解释全在程序的注释里。
示例程序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;
}