免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2709 | 回复: 18
打印 上一主题 下一主题

APUE里的一段代码不解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-04 21:40 |只看该作者 |倒序浏览
void err_sys(const char *fmt, ...)
{
        va_list ap;
        va_start(ap, fmt);
        err_doit(1, errno, fmt, ap);
        va_end(ap);
        exit(1);
}


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".
  */
static 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);
}

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
2 [报告]
发表于 2009-05-04 21:51 |只看该作者
snprintf这个函数我不知道,不过我在baidu里面搜索到了。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
3 [报告]
发表于 2009-05-04 22:00 |只看该作者
你可以看做是拼接字符串

论坛徽章:
0
4 [报告]
发表于 2009-05-04 22:14 |只看该作者
原帖由 xinglp 于 2009-5-4 22:00 发表
你可以看做是拼接字符串


还是不解~~~字符串有这样拼接的?

论坛徽章:
0
5 [报告]
发表于 2009-05-05 00:47 |只看该作者
eg:
err_sys("waitpid error");

将error所对应的出错映射的字符串添加到err_sys的参数之后,输出。

论坛徽章:
0
6 [报告]
发表于 2009-05-05 00:50 |只看该作者
把错误信息按指定格式写到buf中,从buf中空位置开始写,保留buf中已有数据,buf总长度不超过MAXLINE

[ 本帖最后由 llxxtnt 于 2009-5-5 00:52 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-05-05 01:23 |只看该作者
man

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2009-05-05 09:02 |只看该作者
一方面是拼接字符串,另一方面,‘n’是为了防止缓冲区溢出。

论坛徽章:
0
9 [报告]
发表于 2009-05-05 21:54 |只看该作者
函数原型: int snprintf( char* buf, size_t count, const char* format, ... );

字符串拼接,为什么是buf+strlen(buf)MAXLINE-strlen(buf)

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
10 [报告]
发表于 2009-05-06 02:00 |只看该作者

回复 #9 李某人 的帖子

char buf[MAXLINE];
vsnprintf(buf, MAXLINE, fmt, ap);

size_t len = strlen(buf);
char* to_write = buf+len;
size_t remaind = MAXLINE-len;

snprintf(to_write /*buf+strlen(buf)*/ , remaind /*MAXLINE-strlen(buf)*/  , ": %s", strerror(error));

[ 本帖最后由 OwnWaterloo 于 2009-5-6 02:01 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP