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

C語言字串排序完全攻略:指標陷阱與 strcmp 正確用法

     編輯:C 語言問答

為何直接比較指標會失敗?

原程式嘗試用指標交換來排序三字串,但 swap 函數內部修改的是區域指標變數,無法影響 main 中的 m, n, k。且字串比較應用 strcmp,而非逐字元比較指標位址。

核心誤區

  • 指標傳值:swap(char *p, char *q) 接收指標的副本,函數內 p = q 只改變區域副本。
  • 字串比較:"abc" > "def" 比較的是字面常數的記憶體位址,非字典序。
  • 指標交換無效:即使交換成功,printf("%s", m) 印的是 m 指向的內容,若 m 本身未變,輸出不變。

正確做法一:指標陣列 + qsort(推薦)

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

int cmp_str(const void *a, const void *b) {
    return strcmp(*(const char**)a, *(const char**)b);
}

int main() {
    char *strs[3];
    char buf[3][20];
    for (int i = 0; i < 3; i++) {
        scanf("%19s", buf[i]);
        strs[i] = buf[i];
    }
    qsort(strs, 3, sizeof(char*), cmp_str);
    for (int i = 0; i < 3; i++) printf("%s ", strs[i]);
    return 0;
}

正確做法二:手寫冒泡排序(教學用)

void sort_strs(char *a[], int n) {
    for (int i = 0; i < n-1; i++)
        for (int j = 0; j < n-1-i; j++)
            if (strcmp(a[j], a[j+1]) > 0) {
                char *tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;
            }
}

關鍵點總結

  1. 用 指標陣列 存放字串起始位址,排序時交換指標而非搬移字元,效率高。
  2. 比較字串必須用 strcmp(或 strncmp),回傳 <0, 0, >0 對應字典序。
  3. 若需修改主程式的指標,函數參數應為 char **(指標的指標)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved