You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

snprintf仅读取至换行符?Socket消息构建时缺失\n字符问题

问题分析与解决:snprintf未正确写入换行符\n

你遇到的这个问题其实是对snprintf()参数理解的小偏差导致的,咱们来一步步捋清楚:

问题根源

先看你代码里的关键细节:

  1. 第一次调用snprintf(NULL, 0, ...)得到的sz,是格式化后字符串的实际长度(不包含终止空字符\0)。
  2. 你用calloc(sz + 1, sizeof(char))分配了足够的内存(留足了\0的位置),这部分是对的。
  3. 但第二次调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:59:10