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

C语言中%s打印char数组为空但逐字符打印正常的问题排查

问题原因

printf的%s格式符打印字符串时,会从传入的内存地址开始逐字符读取,直到遇到值为0的'\0'字符串终止符才会停止输出。
你的代码中计算数组长度size时已经把末尾的'\0'算入了长度,但两层冒泡排序的循环边界写为i < size、j < size,把数组最后一位的'\0'也纳入了排序范围。'\0'的ASCII值为0,比所有大小写字母的ASCII值都小,排序完成后会被交换到数组的第一个位置,此时printf读取第一个字符就碰到终止符,自然输出空白。
而你写的逐字符打印循环是按数组总长度遍历所有下标,不管'\0'在什么位置都会打印对应位置的字符,首位的'\0'是不可见字符不会显示,但后面存储的有效字符会被正常输出,所以你能确认数组里存了有效数据。

修复方案

调整两层排序循环的边界,只对'\0'之前的有效字符做排序,不要移动终止符的位置即可,修改后的排序循环代码如下:

char temp;
for (int i = 0; i < size - 1; i++)
{
    for (int j = i + 1; j < size - 1; j++)
    {
        if (tolower(buff[i]) > tolower(buff[j]))
        {
            temp = buff[i];
            buff[i] = buff[j];
            buff[j] = temp;
        }
    }
}

修改后'\0'会始终保留在数组末尾,此时调用printf("%s\n", buff)即可正常输出排序后的字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:09:22