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

字符串排序后使用printf("%s")无法输出的原因及解决方法

问题分析与解决:printf("%s")无法输出排序后的字符串

这个问题我之前也碰到过,其实核心是C语言字符串的结束标志规则在搞鬼!

为什么会出现这个问题?

C语言里的字符串是以**空字符'\0'**作为结束标记的,printf("%s", str)的工作逻辑是从数组起始位置开始逐个打印字符,直到遇到'\0'就停止。

看你的代码:

  • 初始化str时,编译器会自动在字符串末尾加上一个'\0'作为结束标志;
  • 但你排序时用了sizeof(str)作为循环终止条件,而sizeof(str)计算的是整个数组的总长度(包括末尾的'\0');
  • 因为'\0'的ASCII码是0,是所有字符中最小的,排序后它会被放到数组的第一个位置!

这样一来,printf("%s", str)一开始就碰到了'\0',直接停止输出,自然什么都看不到。而逐个字符打印是遍历整个数组,所以能输出所有字符(包括不可见的'\0')。

解决办法

只需要修改循环条件,让排序过程**不包含末尾的'\0'**即可,把两个for循环的终止条件从sizeof(str)改成sizeof(str) - 1:

#include <stdio.h>
int main(void) {
    int i, j;
    char str[] = "Hello!! How are you?? I'm Fine. No Thank you.", temp;
    // 排除末尾的'\0',只排序有效字符
    for (i = 0; i < sizeof(str) - 1; i++) {
        for (j = i + 1; j < sizeof(str) - 1; j++) {
            if (str[i] > str[j]) {
                temp = str[j];
                str[j] = str[i];
                str[i] = temp;
            }
        }
    }
    for(i = 0; i < sizeof(str); i++) printf("%c", str[i]);
    printf("\n"); // 换行区分两次输出
    printf("%s", str);
    return 0;
}

原理说明

sizeof(str) - 1代表数组中有效字符的数量(因为最后一位是编译器自动添加的'\0'),这样排序时只会处理实际的可见字符,'\0'会一直留在数组的最后位置,作为字符串的结束标志,printf("%s")就能正常遍历并输出所有排序后的字符了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:27:39