sprintf,snprintf,vsprintf,vsnprintf

这几个函数都会在字符串末尾加上null字节,但返回值是不包扩这个null字节的

在X/Open出的XSH 第四次发行第二版中只有第一个函数,后面的三个系统调用是没有的,不过在IEEE Std 1003.1-2008中都包含,The Open Group Base Specifications Issue 7中有这些函数,故这几个函数不会存在移植性问题,期中issue7中还有vdprintf,原型为int vdprintf(int fildes, const char *restrict format, va_list ap);,还有与dprintf对应的其他函数,用于对输出到文件描述符中,不同于以前的流和buffer。

下面是几个错误处理函数,steven的unix网络编程中写的,写的很完美,看他的代码就是一种享受,再看看自己的代码,错误多,不简洁,不健壮。。。

#include        "error.h"
extern  int daemon_proc;
static  void
err_doit(int errnoflag,int level,const char *fmt,va_list ap)
{
        int     errno_save,n;
        char    buf[MAXLINE+1];


        errno_save = errno;
#ifdef  HAVE_VSNPRINTF
        vsnprintf(buf,MAXLINE,fmt,ap);
#else
        vsprintf(buf,fmt,ap);
#endif
        n = strlen(buf);
        if (errnoflag)
                snprintf(buf+n,MAXLINE-n,": %s",strerror(errno_save));
        strcat(buf,"\n");


        if (daemon_proc) {
                syslog(level,"%s",buf);//这儿对的,书上源码出现了一点点毗漏,书中没有“%s”,
        } else {
                fflush(stdout);
                fputs(buf,stderr);
                fflush(stderr);
        }
        return;
}
void
err_ret(const char *fmt,...)
{
        va_list ap;


        va_start(ap,fmt);
        err_doit(1,LOG_INFO,fmt,ap);
        va_end(ap);
        return;
}
void
err_sys(const char *fmt,...)
{
        va_list ap;


        va_start(ap,fmt);
        err_doit(1,LOG_ERR,fmt,ap);
        va_end(ap);
        exit(1);
}
void
err_dump(const char *fmt,...)
{
        va_list ap;


        va_start(ap,fmt);
        err_doit(1,LOG_ERR,fmt,ap);
        va_end(ap);
        abort();
        exit(1);
}
void
err_msg(const char *fmt,...)
{
        va_list ap;


        va_start(ap,fmt);
        err_doit(0,LOG_INFO,fmt,ap);
        va_end(ap);
        return;
}
void
err_quit(const char *fmt,...)
{
        va_list ap;


        va_start(ap,fmt);
        err_doit(0,LOG_ERR,fmt,ap);
        va_end(ap);
        exit(1);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值