Chinaunix

标题: APUE里的一段代码不解 [打印本页]

作者: 李某人    时间: 2009-05-04 21:40
标题: APUE里的一段代码不解
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);
}
作者: ilex    时间: 2009-05-04 21:51
snprintf这个函数我不知道,不过我在baidu里面搜索到了。
作者: xinglp    时间: 2009-05-04 22:00
你可以看做是拼接字符串
作者: 李某人    时间: 2009-05-04 22:14
原帖由 xinglp 于 2009-5-4 22:00 发表
你可以看做是拼接字符串


还是不解~~~字符串有这样拼接的?
作者: logicBaby    时间: 2009-05-05 00:47
eg:
err_sys("waitpid error");

将error所对应的出错映射的字符串添加到err_sys的参数之后,输出。
作者: llxxtnt    时间: 2009-05-05 00:50
把错误信息按指定格式写到buf中,从buf中空位置开始写,保留buf中已有数据,buf总长度不超过MAXLINE

[ 本帖最后由 llxxtnt 于 2009-5-5 00:52 编辑 ]
作者: DQP    时间: 2009-05-05 01:23
man
作者: dreamice    时间: 2009-05-05 09:02
一方面是拼接字符串,另一方面,‘n’是为了防止缓冲区溢出。
作者: 李某人    时间: 2009-05-05 21:54
函数原型: int snprintf( char* buf, size_t count, const char* format, ... );

字符串拼接,为什么是buf+strlen(buf)MAXLINE-strlen(buf)
作者: OwnWaterloo    时间: 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 编辑 ]
作者: 李某人    时间: 2009-05-08 11:46
谢谢大家
函数的用法我是明白的

用数组的首地址(buf) + 大小(strlen(buf))  就形成了一个新的数组吗?
作者: OwnWaterloo    时间: 2009-05-08 12:57
标题: 回复 #11 李某人 的帖子
不要被“它是一个数组”的想法禁锢了思维。
“它其实就是一段连续内存”
加上一个偏移后, 依然是一段连续内存。
作者: 李某人    时间: 2009-05-08 13:32
原帖由 OwnWaterloo 于 2009-5-8 12:57 发表
不要被“它是一个数组”的想法禁锢了思维。
“它其实就是一段连续内存”
加上一个偏移后, 依然是一段连续内存。


谢谢, I see
作者: styleplus    时间: 2009-05-08 14:05
snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s", strerror(error));              //这句是何用意,不懂啊
------------------------------------------
这个strlen用的很没效率
作者: eveson    时间: 2009-05-08 14:09
原帖由 李某人 于 2009-5-8 13:32 发表


谢谢, I see


偏移后仍然是指针
作者: styleplus    时间: 2009-05-08 14:13
另外这段代码有bug,
用vsnprintf和snprintf, 目的想限制不溢出,
结果又来一个 strcat(buf, "\n"); 仍旧可能溢出
作者: 李某人    时间: 2009-05-08 14:42
代码好不好我就无法定论了,  那可是大师写的代码噢
styleplus兄,说说怎么写好呢

[ 本帖最后由 李某人 于 2009-5-8 14:43 编辑 ]
作者: styleplus    时间: 2009-05-08 14:46
原帖由 李某人 于 2009-5-8 14:42 发表
代码好不好我就无法定论了,  那可是大师写的代码噢


这就是软件, 正常哦, 丝毫不损大师的美誉度
作者: 李某人    时间: 2009-05-09 20:43
是吗,   总之,谢谢大家的热心解答,呵呵




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2