मैं एक समारोह 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 "जोड़ने के लिए प्रतिलिपि बनाना है, और उसके बाद उस अस्थायी बफर को पर अस्थायी प्रतिलिपि बनाना अस्थायी buffe फंक्शन कॉल से प्रदान किए गए तर्कों के साथ वास्तविक स्वरूपण करने के लिए, और केवल 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;
}
यदि मैं कर सकता, तो मैं यहां कई उत्तरों स्वीकार करता हूं, लेकिन मेह।
आपका कोड (मेरा उत्तर देखें) 'strncpy' के गलत उपयोग की वजह से टूट गया है काटना चाहते हैं। – AnT
'strncat' का उपयोग भी टूटा हुआ है। 'strncat' ऐसा नहीं करता जो आपको लगता है कि यह करता है। 'BUFSIZE-2' के लिए – AnT