Ho una funzione irc_sendline
che può essere chiamata come printf
puòC di argomenti variabili refactoring
irc_sendline(s, "A strange game.\nThe only %s is not to play.", "winning move");
Funziona perfettamente, ma non sono felice con la sua attuazione:
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;
}
Vedete, Sto usando 2 buffer "temporanei" qui, perché devo prima copiare il messaggio originale dagli argomenti della funzione in un buffer temporaneo per aggiungere "\ r \ n" ad esso, e quindi copiare quel buffer temporaneo su un altro temporaneo Buffe r per fare la formattazione effettiva con gli argomenti forniti dalla chiamata di funzione, e solo THEN Posso inviare la roba sulla sua strada.
Come posso rendere questo detergente, meglio?
Grazie per tutti gli input qui, ho pensato che il mio unico problema era il caos in là, ma era in realtà un timebomb ticchettio! La mia nuova funzione assomiglia a questa:
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;
}
Se potessi, accetterei più risposte qui, ma meh.
Il codice è rotto a causa di un uso improprio del 'strncpy' (vedi la mia risposta). – AnT
Anche l'uso di 'strncat' è rotto. 'strncat' non fa quello che pensi che faccia. – AnT