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
相关产品推荐
相关产品推荐

