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

printf输出异常排查:数组赋值后%s未打印预期字符

问题描述

我从文件读取内容并写入char*时,发现数组下标96之后的字符无法保存,于是编写以下测试代码排查:

int main(void){
    char array[5];
    memset(array, 0, sizeof(array));
    array[1] = 'A';
    array[2] = '\0';
    printf("\n---%s---\n", array);
    return 0;
}

预期控制台输出---A---,但A未显示,请问问题出在哪里?

问题原因与解决

核心问题

printf的%s格式符是从传入的指针起始位置开始输出字符,直到遇到第一个\0(空字符)才停止。你的代码里:

  • memset(array, 0, sizeof(array))把整个数组的所有元素都设为了0(也就是\0);
  • 你把'A'存在了array[1],但array[0]已经是\0了,所以printf("%s", array)刚一开始读就遇到终止符,直接输出空字符串,后面的'A'根本不会被读取。

修正方案

有两种简单的修正方式:

  1. 将'A'放到数组的起始位置(符合%s对字符串起始位置的要求):
int main(void){
    char array[5];
    memset(array, 0, sizeof(array));
    array[0] = 'A';
    array[1] = '\0';
    printf("\n---%s---\n", array);
    return 0;
}
  1. 如果只是想输出单个字符,改用%c格式符直接指定输出array[1]:
int main(void){
    char array[5];
    memset(array, 0, sizeof(array));
    array[1] = 'A';
    printf("\n---%c---\n", array[1]);
    return 0;
}

关于你最初的文件读取问题

这个测试代码的问题和你原本遇到的“下标96之后的字符无法保存”无关,大概率是以下原因导致:

  • 分配的内存空间不够,比如只给了96字节的内存,超出部分属于越界写入,会导致数据丢失或覆盖;
  • 读取文件时的逻辑错误,比如误将某个字符识别为\0终止符,提前停止了读取;
  • 读取函数的参数设置有误,比如限制了读取长度最多96个字符;
  • 文件本身在96位置之后存在特殊字符,导致读取异常。

内容的提问来源于stack exchange,提问作者kontingent-freieste

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 11:15:38