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

C语言中二维字符数组解析及字符串排序示例代码解读

解析C语言二维字符数组与字符串排序示例代码

没问题,我来帮你拆解这个C语言二维字符数组和字符串排序的示例代码,讲清楚每一部分的逻辑和用法。

一、二维字符数组的核心理解

在C语言里,二维字符数组是专门用来存储多个字符串的连续内存容器,比如char strs[MAX][MAX];:

  • 第一个MAX表示最多能存储多少个字符串
  • 第二个MAX表示单个字符串的最大长度(必须留1个字节给字符串结束符\0)

它和指针数组char *strs[]的关键区别是:二维字符数组的内存是连续的,每个字符串占用固定长度的空间;而指针数组是指向不同字符串的指针集合,字符串可以存放在任意内存区域(比如堆或者常量区)。

二、完整可运行的示例代码

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

#define MAX 100

// 用冒泡排序对二维字符数组中的字符串按字典序排序
void sortStrings(char strs[][MAX], int count) {
    char temp[MAX]; // 临时数组,用于交换字符串时的中转
    // 冒泡排序外层循环:控制排序轮次,每轮确定一个最大元素的位置
    for (int i = 0; i < count - 1; i++) {
        // 内层循环:两两比较相邻字符串,完成一轮冒泡
        for (int j = 0; j < count - i - 1; j++) {
            // strcmp返回值>0,说明strs[j]字典序大于strs[j+1],需要交换
            if (strcmp(strs[j], strs[j+1]) > 0) {
                strcpy(temp, strs[j]);
                strcpy(strs[j], strs[j+1]);
                strcpy(strs[j+1], temp);
            }
        }
    }
}

int main() {
    char strings[MAX][MAX]; // 定义存储字符串的二维数组
    int numStrings;

    // 读取用户输入的字符串数量
    printf("请输入字符串的数量:");
    scanf("%d", &numStrings);
    getchar(); // 吃掉scanf留下的换行符,避免影响后续fgets读取

    // 逐个读取用户输入的字符串
    for (int i = 0; i < numStrings; i++) {
        printf("请输入第%d个字符串:", i+1);
        fgets(strings[i], MAX, stdin);
        // 去掉fgets自动读取的换行符,替换为字符串结束符
        strings[i][strcspn(strings[i], "\n")] = '\0';
    }

    // 调用排序函数对字符串排序
    sortStrings(strings, numStrings);

    // 输出排序后的结果
    printf("\n排序后的字符串列表:\n");
    for (int i = 0; i < numStrings; i++) {
        printf("%s\n", strings[i]);
    }

    return 0;
}

三、代码逐段解读

1. 头文件与宏定义

  • <stdio.h>:提供输入输出核心函数,比如printf(输出)、scanf(读取整数)、fgets(读取字符串)
  • <stdlib.h>:示例中虽未直接用到,但常规会包含它,用于内存分配(如malloc)等场景的兼容
  • <string.h>:字符串操作的“工具箱”,提供strcmp(比较字符串字典序)、strcpy(拷贝字符串)、strcspn(查找特定字符位置)这些核心函数
  • #define MAX 100:把重复使用的长度值定义成宏,后续要修改字符串最大长度时,只改这一处即可

2. sortStrings排序函数解析

这是基于冒泡排序实现的字符串排序逻辑:

  • 参数char strs[][MAX]:传入二维字符数组时,第二个维度必须指定长度,因为编译器需要知道每个字符串占用的内存大小,才能正确定位数组元素
  • 参数int count:传入实际要排序的字符串数量(避免对数组中未使用的空字符串排序)
  • 排序逻辑:
    • 外层循环:每执行一次,就会把当前未排序部分中字典序最大的字符串“移动”到末尾
    • 内层循环:两两比较相邻的两个字符串,用strcmp判断顺序:
      • strcmp(a, b)返回值>0 → a的字典序大于b,需要交换两者位置
    • 字符串交换:因为二维字符数组的每个元素是字符数组,所以不能直接用=赋值,必须用strcpy完成内存内容的拷贝,借助临时数组temp作为中转

3. main函数核心流程

main函数负责完成“输入-排序-输出”的完整流程:

  • 定义二维字符数组strings,用来存储用户输入的所有字符串
  • 读取字符串数量后,用getchar()吃掉scanf留下的换行符——否则fgets会直接读取这个换行符,导致第一个字符串为空
  • 用fgets读取字符串(相比scanf,fgets能正确读取带空格的字符串),然后通过strcspn找到换行符的位置,替换为\0,去掉多余的换行
  • 调用sortStrings完成排序,最后遍历输出排序后的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:41