我有一个函数 irc_sendline
可以像 printf
一样调用
irc_sendline(s, "A strange game.\nThe only %s is not to play.", "winning move");
它工作得很好,但我对它的实现不满意:
int irc_sendline(irc *iobj, char *msg, ...)
{
char tmp_msg[BUFSIZE], fmsg[BUFSIZE];
va_list args;
int len;
va_start(args, msg);
strncpy(tmp_msg, msg, BUFSIZE);
strncat(tmp_msg, "\r\n", BUFSIZE);
len = vsnprintf(fmsg, BUFSIZE, tmp_msg, args);
len = send(iobj->fd, fmsg, len, 0);
return len;
}
你看,我在这里使用了 2 个“临时”缓冲区,因为我首先必须将原始消息从函数参数复制到临时缓冲区以向其附加“\r\n”,然后复制该临时缓冲区缓冲区到另一个临时缓冲区,以使用函数调用提供的参数进行实际格式化,只有然后我才能发送这些东西。
我怎样才能使它更干净、更好?
感谢您提供的所有信息,我以为我唯一的问题是那里乱七八糟,但实际上它是一颗定时炸弹!我的新函数如下所示:
int irc_sendline(irc *iobj, char *msg, ...)
{
char buffer[BUFSIZE];
va_list args;
int res_str_len;
int sent;
va_start(args, msg);
res_str_len = vsnprintf(buffer, BUFSIZE, msg, args);
sent = send(iobj->fd, buffer, res_str_len, 0);
sent += send(iobj->fd, "\r\n", 2, 0);
return sent;
}
如果可以的话,我会在这里接受多个答案,但是嗯。
最佳答案
首先使用 vsnprintf
格式化数据,然后将“\r\n”附加到结果。或者,只需再次调用 send
即可发送“\r\n”。
关于C变量参数重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2835641/