que tienen una función irc_sendline
que se puede llamar como printf
puedevariable C argumento refactorización
irc_sendline(s, "A strange game.\nThe only %s is not to play.", "winning move");
Funciona perfectamente, pero no estoy feliz con su implementación:
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;
}
Ves, Estoy usando 2 búferes "temporales" aquí, porque primero tengo que copiar el mensaje original de los argumentos de la función en un búfer temporal para agregarle "\ r \ n" y luego copiar ese búfer temporal en otro temporal buffe r para hacer el formateo real con los argumentos proporcionados desde la llamada a la función, y solo ENTONCES Puedo enviar el material en camino.
¿Cómo podría hacer que este limpiador, mejor?
Gracias por toda la entrada aquí, pensé que mi único problema era el desorden allí, pero era en realidad una bomba de relojería! Mi nueva función es el siguiente:
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;
}
Si pudiera, me gustaría aceptar múltiples respuestas aquí, pero meh.
Su código se rompe debido a la incorrecta utilización de 'strncpy' (véase mi respuesta). – AnT
Su uso de 'strncat' también está roto. 'strncat' no hace lo que crees que hace. – AnT