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

C 語言字符串排序中 strcmp 使用錯誤導致結果異常

     編輯:程式設計綜合問答

原始代碼問題

void sort(char *name[], int n) {
    char *temp;
    int i, j, k;
    for (i = 0; i < n-1; i++) {
        k = i;
        for (j = i+1; j < n; j++)
            if (strcmp(name[k], name[i]) < 0)  // 錯誤:應比較 name[j] 與 name[k]
                k = j;
        if (k != i) {
            temp = name[i];
            name[i] = name[k];
            name[k] = temp;
        }
    }
}

錯誤分析

  • 內層循環變量是 j,但比較時卻使用 name[i] 作為基準,導致選擇排序邏輯錯誤。
  • 正確邏輯:每輪找到最小元素索引 k,需將 name[j] 與當前最小 name[k] 比較。

修正後的選擇排序

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

完整可運行示例

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

void sort(char *name[], int n) { /* 上述修正代碼 */ }
void print(char *name[], int n) {
    for (int i = 0; i < n; i++) puts(name[i]);
}

int main() {
    char *name[] = {"C programming", "BASIC", "Java", "FORTRAN", "Computer"};
    int n = 5;
    sort(name, n);
    print(name, n);
    return 0;
}

輸出結果 (字典序升序)

BASIC
C programming
Computer
FORTRAN
Java

關鍵點提示

  • strcmp(s1, s2) < 0 表示 s1 字典序小於 s2。
  • 選擇排序每輪只交換一次,適合指針數組排序(移動指針而非數據)。
  • 若需降序,將比較條件改為 > 0。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved