snprintf仅读取至换行符?Socket消息构建时缺失\n字符问题
问题分析与解决:snprintf未正确写入换行符\n
你遇到的这个问题其实是对snprintf()参数理解的小偏差导致的,咱们来一步步捋清楚:
问题根源
先看你代码里的关键细节:
- 第一次调用
snprintf(NULL, 0, ...)得到的sz,是格式化后字符串的实际长度(不包含终止空字符\0)。 - 你用
calloc(sz + 1, sizeof(char))分配了足够的内存(留足了\0的位置),这部分是对的。 - 但第二次调用
snprintf(username, sz, ...)时,传入的缓冲区大小是sz——这就错了!
snprintf()的第二个参数是缓冲区的总字节数(必须包含终止空字符的位置)。当你传入sz时,它会认为缓冲区最多只能容纳sz字节,所以最多写入sz-1个有效字符,然后自动加上\0。而你的目标字符串长度刚好是sz(包含\r\n),这就导致最后一个字符\n被直接截断了,只保留了前面的\r,然后补上\0——这就是你输出里看到13(\r)之后直接是0(\0)的原因。
修复方案
只需要把第二次snprintf()的缓冲区大小改成你实际分配的sz + 1即可:
snprintf(username, sz + 1, "USER %s\r\n", USERNAME_ANONYMOUS);
这样snprintf()就有足够的空间写入全部sz个有效字符(包括\r和\n),再加上终止空字符,完全符合你的预期。
额外小提示
你的循环打印条件i <= sz其实可以调整为i < sz + 1,这样更直观(因为username的有效索引范围是0到sz,共sz+1个元素),不过这不是导致问题的核心原因,修复上面的snprintf参数就可以解决你的主要问题。
内容的提问来源于stack exchange,提问作者j3141592653589793238
相关产品推荐
相关产品推荐

