C变量参数重构

标签 c function refactoring

我有一个函数 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/

相关文章:

c - C语言中的lambda函数是什么

c++ - 从 BCRYPT_SECRET_HANDLE 将共享 secret 导出为 BYTE 数组

c - 将结构体值从 function() 返回到 main()

c - 在 C 中使用数组结构函数

php - 我应该重构这段代码吗?

c - 如果定义(__AIX)不能在 AIX 6.1 上工作?

c++ - C/C++ - 覆盖默认函数

C - 将参数未知的函数传递给另一个函数,并调用它

.net - 有没有办法以编程方式提取接口(interface)?

python - pygame类结构