У меня есть функция irc_sendline
, которая может быть вызвана как printf
can
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», а затем скопировать этот временный Буфер для другого временного буфера для выполнения фактического форматирования с аргументами, предоставленными из вызова функции, и только THEN Я могу отправить материал в его пути.
Как я могу сделать это чище, лучше?
Спасибо за весь вклад, я думал, что моей единственной проблемой был беспорядок там, но на самом деле это была бомба замедленного действия! Моя новая функция выглядит так:
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;
}
Если бы я мог, я бы принял несколько ответов здесь, но ме.