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

C语言使用recv()接收含\0和\n的内容并按转义序列打印的实现方法

解决方案

你原来的代码直接使用printf("%s")输出缓冲区存在两个问题:一是C字符串以\0作为结束标志,遇到流中的\0会直接截断输出;二是原生输出不会对\n、\0做转义处理。你只需要遍历接收到的每个字节做分支处理即可,不需要修改服务端逻辑。

修改后的代码示例

你可以直接把原有代码中printf输出的部分替换为逐字节处理逻辑,完整的接收逻辑如下:

//CODE FROM BJ'S GUIDE TO NETWORK PROGRAMMING
if ((numbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {
        perror("recv");
        exit(1);
    }

// 逐字节处理输出,不需要再给buf加末尾\0
for (int i = 0; i < numbytes; i++) {
    switch(buf[i]) {
        case '\0':
            printf("\\0");
            break;
        case '\n':
            printf("\\n");
            break;
        default:
            putchar(buf[i]);
    }
}

// 后续循环接收的部分也做相同修改
while (numbytes > 0) {
    numbytes = recv(sockfd, buf, MAXDATASIZE, 0);
    if (numbytes > 0) {
        for (int i = 0; i < numbytes; i++) {
            switch(buf[i]) {
                case '\0':
                    printf("\\0");
                    break;
                case '\n':
                    printf("\\n");
                    break;
                default:
                    putchar(buf[i]);
            }
        }
    }
}

注意事项

  • 原有代码中buf[numbytes] = '\0';的逻辑可以直接删除,我们不需要将缓冲区当做C字符串处理,直接按recv返回的有效字节数numbytes遍历即可,还能避免缓冲区占满时的越界风险。
  • 你也可以把逐字节处理的逻辑封装成独立的工具函数,减少重复代码。如果后续需要支持其他转义字符(比如\t、\r),只需要在switch分支中新增对应规则即可。

内容的提问来源于stack exchange,提问作者Lauziex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:45:01