C语言字符数组处理后printf输出异常:已赋值的'+'无法通过字符串格式显示的问题
问题根源:字符串缺少终止符 + 循环逻辑错误
你遇到的问题本质上是两个原因叠加导致的:C语言字符串必须以'\0'(空字符)作为终止标志,再加上你的循环逻辑错误地把request的字符串终止符也写到了mem数组里。
一步步分析为什么会这样:
- 先看
request的定义:char request[16] = "b44849";。字符串字面量"b44849"在内存中会自动追加一个'\0'作为终止符,所以request的第6个元素(索引6)的值是'\0',strlen(request)返回的长度是6(不包含终止符)。 - 你的循环逻辑里,当
i < strlen(request) + 8时,执行mem[i] = request[i-7]。计算一下:strlen(request)+8 = 6+8=14,所以i从8到13的时候会进入这个分支:- i=8 → i-7=1 →
mem[8] = request[1] = '4' - i=9 → i-7=2 →
mem[9] = request[2] = '4' - i=10 → i-7=3 →
mem[10] = request[3] = '8' - i=11 → i-7=4 →
mem[11] = request[4] = '4' - i=12 → i-7=5 →
mem[12] = request[5] = '9' - i=13 → i-7=6 →
mem[13] = request[6] = '\0'(这里是关键!把request的终止符写到了mem里)
- i=8 → i-7=1 →
- 当你用
printf("%s", mem)输出时,printf会从数组起始位置开始打印字符,直到遇到第一个'\0'就停止——所以打印到mem[12]的'9'之后,遇到mem[13]的'\0'就终止了,后面的'+'自然不会显示。 - 单独访问
mem[13]时,输出的是空字符,因为'\0'是不可打印的控制字符;mem[14]和mem[15]确实被赋值成了'+',所以能正常打印。
修正方案
需要同时解决两个问题:循环逻辑错误(避免把request的终止符写入mem),以及给mem添加字符串终止符。
修正后的代码:
#include <stdio.h> #include <string.h> int main() { char mem[32]; char request[16] = "b44849"; if (request[0] == 'b') { int request_rest_len = strlen(request) - 1; // 去掉第一个字符后的有效长度 for (int i = 0; i < 16; i++) { if (i < 8) { mem[i] = '-'; } else { if (i < 8 + request_rest_len) { // 仅取request从索引1开始的有效字符 mem[i] = request[i - 7]; } else { mem[i] = '+'; } } } // 给mem添加字符串终止符,确保printf能识别完整内容 mem[16] = '\0'; } printf("%s\n", mem); // 现在会输出--------44849+++ // 验证单个元素 printf("%c\n", mem[13]); // 输出'+' printf("%c\n", mem[14]); // 输出'+' printf("%c\n", mem[15]); // 输出'+' return 0; }
关键修改点:
- 计算
request_rest_len = strlen(request) - 1:因为要去掉第一个字符,剩余有效字符的长度是原长度减1,这样循环时只会把request[1]到request[5](也就是'44849')写入mem,不会触及request[6]的'\0'。 - 在循环结束后给
mem[16]赋值'\0':因为我们循环到i=15,把终止符放在索引16的位置,确保整个16个字符都能被printf("%s")识别为有效字符串。
内容的提问来源于stack exchange,提问作者Jokubas11
相关产品推荐
相关产品推荐

