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

如何移除C语言数组初始化的方括号?无方括号数组排序问题

解决无方括号的C语言字符排序问题

完整实现代码

#include <stdio.h>
#include <stdlib.h>

// 交换两个字符的函数
void swap(char *a, char *b) {
    char temp = *a;
    *a = *b;
    *b = temp;
}

// 排序函数:按字母顺序排序,全程无方括号操作
void sort(char *str, int length) {
    for (int i = 0; i < length - 1; i++) {
        for (int j = i + 1; j < length; j++) {
            // 用指针偏移代替方括号访问字符
            if (*(str + i) > *(str + j)) {
                swap(str + i, str + j);
            }
        }
    }
}

int main() {
    const int MAX_SIZE = 80;
    // 动态分配字符数组,无需方括号
    char *str = malloc(MAX_SIZE * sizeof(char));
    if (!str) {
        printf("内存分配失败\n");
        return 1;
    }

    printf("输入最多80个字符(可包含空格):");
    // 读取一行输入,处理更便捷
    fgets(str, MAX_SIZE, stdin);
    
    // 计算实际输入长度(去除末尾换行符)
    int length = 0;
    while (*(str + length) != '\n' && *(str + length) != '\0') {
        length++;
    }
    // 替换换行符为字符串结束符
    if (*(str + length) == '\n') {
        *(str + length) = '\0';
    }

    sort(str, length);
    printf("排序后的结果:%s\n", str);

    free(str);
    return 0;
}

关键问题修正与说明

  1. 去掉所有方括号
    全程用*(str + i)指针偏移语法替代str[i],完全符合“禁止使用方括号”的要求。

  2. 纠正你的代码错误

    • 你之前用char *str[size]定义指针数组是冗余设计,单个动态分配的字符数组char *str就足够存储所有输入字符;
    • 用strcmp比较单个字符是错误用法,strcmp用于字符串比较,单个字符直接通过ASCII值用>/<比较即可;
    • swap函数必须传递字符的地址(指针),才能修改原数组中的字符值,之前的调用方式无法实现有效交换。
  3. 可选的逐个输入版本
    如果要像你最初代码那样逐个输入字符,可替换main函数中的输入逻辑:

    printf("输入最多80个字符,逐个输入:\n");
    int length = 0;
    while (length < MAX_SIZE - 1) { // 预留结束符位置
        printf("输入第%d个字符:", length + 1);
        scanf(" %c", str + length);
        // 允许回车提前结束输入
        if (*(str + length) == '\n') break;
        length++;
    }
    *(str + length) = '\0';
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:13:25