首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言實現兩字母字符串字典序排序:qsort 配合 strcmp 完整示例

     編輯:程式設計綜合問答

題目需求

輸入 N 個長度為 2 的字符串,按字典序升序輸出。
示例:`ab jh ac aa bn` → `aa ab ac bn jh`

核心代碼


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

#define MAX_N 1000
#define STR_LEN 2

// qsort 比較函數:字符串指針轉換後調用 strcmp
int cmp_str(const void *a, const void *b) {
    const char *sa = *(const char**)a;
    const char *sb = *(const char**)b;
    return strcmp(sa, sb);
}

int main() {
    int n;
    if (scanf("%d", &n) != 1 || n <= 0 || n > MAX_N) return 1;
    
    // 動態分配指針數組
    char **arr = malloc(n * sizeof(char*));
    char buf[STR_LEN + 2]; // 讀取緩衝
    
    for (int i = 0; i < n; i++) {
        scanf("%2s", buf); // 限制讀取寬度防溢出
        arr[i] = malloc(STR_LEN + 1);
        strcpy(arr[i], buf);
    }
    
    qsort(arr, n, sizeof(char*), cmp_str);
    
    for (int i = 0; i < n; i++) {
        printf("%s%c", arr[i], (i == n-1) ? '\n' : ' ');
        free(arr[i]);
    }
    free(arr);
    return 0;
}

關鍵點講解

  1. 指針數組 `char **arr`:存儲每個動態分配字符串的首地址,`qsort` 排序指針而非移動字符串內容,效率高。
  2. 比較函數 `cmp_str`:`qsort` 傳遞元素地址,此處元素為 `char*`,故轉換為 `const char**` 解引用後調用標準庫 `strcmp`,完美支持字典序。
  3. 內存管理:讀取時 `malloc`,輸出後 `free`,無洩漏。
  4. 輸入安全:`scanf("%2s", buf)` 限制寬度,防止緩衝區溢出。

進階:結構體封裝 (可擴展長度可變字符串)


typedef struct { char str[3]; } Str2;
int cmp_str2(const void *a, const void *b) {
    return strcmp(((Str2*)a)->str, ((Str2*)b)->str);
}
// 使用 Str2 arr[MAX_N],qsort(arr, n, sizeof(Str2), cmp_str2);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved