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

C语言字符数组处理后printf输出异常:已赋值的'+'无法通过字符串格式显示的问题

问题根源:字符串缺少终止符 + 循环逻辑错误

你遇到的问题本质上是两个原因叠加导致的:C语言字符串必须以'\0'(空字符)作为终止标志,再加上你的循环逻辑错误地把request的字符串终止符也写到了mem数组里。

一步步分析为什么会这样:

  1. 先看request的定义:char request[16] = "b44849";。字符串字面量"b44849"在内存中会自动追加一个'\0'作为终止符,所以request的第6个元素(索引6)的值是'\0',strlen(request)返回的长度是6(不包含终止符)。
  2. 你的循环逻辑里,当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里)
  3. 当你用printf("%s", mem)输出时,printf会从数组起始位置开始打印字符,直到遇到第一个'\0'就停止——所以打印到mem[12]的'9'之后,遇到mem[13]的'\0'就终止了,后面的'+'自然不会显示。
  4. 单独访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:09:08