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

C 語言字串排序:二維陣列與指標參數錯誤修正

     編輯:程式設計綜合問答

原始程式碼核心錯誤

  1. char name[10]; 宣告的是**單維**字元陣列(只能存一個長度 ≤9 的字串),但 `sort` 需要**二維**陣列或指標陣列(`char* name[10]`)存放 10 個字串。
  2. `gets(name)` 僅讀取一行到同一緩衝區,覆寫前一筆資料,且 `gets` 不安全已被移除(C11)。
  3. 排序函數參數 `char *name[]` 對應二維陣列,實際傳入一維陣列導致型別不匹配、記憶體亂存取。

修正版本

#include 
#include 

#define MAX_STR 10
#define MAX_LEN 80

void sort(char *name[], int n) {
    char *tmp;
    for (int i = 0; i < n - 1; i++) {
        int k = i;
        for (int j = i + 1; j < n; j++) {
            if (strcmp(name[j], name[k]) < 0) k = j;
        }
        if (k != i) {
            tmp = name[i]; name[i] = name[k]; name[k] = tmp;
        }
    }
}

int main() {
    char storage[MAX_STR][MAX_LEN]; // 真正存放字串的二維陣列
    char *name[MAX_STR];            // 指標陣列指向每行
    for (int i = 0; i < MAX_STR; i++) {
        printf("輸入第 %d 個字串: ", i + 1);
        fgets(storage[i], MAX_LEN, stdin);
        storage[i][strcspn(storage[i], "\n")] = '\0'; // 去換行
        name[i] = storage[i];
    }
    sort(name, MAX_STR);
    for (int i = 0; i < MAX_STR; i++)
        puts(name[i]);
    return 0;
}

關鍵修正點

  • 使用 `char storage[10][80]` 實際存儲字串,`char *name[10]` 做指標陣列供排序交換指標,避免大量字串拷貝。
  • 輸入用 `fgets` 替代 `gets`,並手動移除換行符。
  • 排序函數加入長度參數 `n`,提高通用性。

理解「二維陣列存資料、指標陣列做排序」的分離思想,是 C 語言處理多字串排序的標準模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved