同样出自apue.h error.c ,与vsnprintf的用法相似,也是拷贝字符串。
来个demo应该就知道了:
#include <stdio.h>
#include <string.h>
/*
将可变个参数(...)按照format格式化成字符串,然后将其复制到str中
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),
返回值为格式化后的字符串的长度。
函数原型:
int snprintf(char *str, size_t size, const char *format, ...);
参数说明:
str 目的地
size 允许拷贝的最大长度
format 格式
... 可变参数按照format格式化成字符串
*/
int main()
{
char str[5];
memset(str,0,sizeof(str));
int rt=snprintf(str,3,"%s","abcdefg");
printf("%d\n",rt);
printf("%s\n",str);
return 0;
}
输出:
通过笔记一到三的学习,终于可以把apue.h error.c里的封装看懂了,泪流满面呀。下面抽取其中的代码段来,写了一个测试程序:
#include <errno.h>
#include <unistd.h> /*for sysconf pathconf _SC_OPEN_MAX*/
#include <stdio.h> /*for printf*/
#include <stdarg.h> /* for va_list */
#include <string.h> /* for strlen strcat */
#include <stdlib.h> /* for exit */
#define MAXLINE 4096 /* max line length */
void err_quit(const char *fmt, ...);
void err_exit(int error, const char *fmt, ...);
void err_doit(int errnoflag, int error, const char *fmt, va_list ap);
int
main(int argc, char *argv[])
{
//if (argc != 2)
// err_quit("usage: a.out <dirname>");
//if (1)
// err_quit("%d minutes,%d seconds.",1,2);
if (1)
err_exit(1,"%d minutes,%d seconds.",1,2);
}
/*
* Fatal error unrelated to a system call.
* Error code passed as explict parameter.
* Print a message and terminate.
*/
void err_exit(int error, const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(1, error, fmt, ap);
va_end(ap);
exit(1);
}
/*
* Fatal error unrelated to a system call.
* Print a message and terminate.
*/
void err_quit(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
err_doit(0, 0, fmt, ap);
va_end(ap);
exit(1);
}
/*
* Print a message and return to caller.
* Caller specifies "errnoflag".
*/
void err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE];
vsnprintf(buf, MAXLINE, fmt, ap);//把格式化的输出字符串生成
if (errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s",strerror(error));//把错误翻译成描述信息
strcat(buf, "\n");//加一个换行符
fflush(stdout);//冲洗标准输出的缓存区
fputs(buf, stderr);//把错误信息输出到标准错误流
fflush(NULL);//冲洗所有输出流
}
输出: