У меня есть функция irc_sendline
, которую можно назвать как printf
можетC переменная аргумент рефакторинга
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», а затем скопировать этот временный буфер в еще Buffe r для фактического форматирования с аргументами, предоставленными из вызова функции, и только 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;
}
Если бы я мог, я бы принял несколько ответов здесь, но meh.
Ваш код нарушается из-за неправильного использования 'strncpy' (см мой ответ). – AnT
Ваше использование 'strncat' также нарушено. 'strncat' не делает то, что вы думаете. – AnT