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

C語言函數調用求最大值:六大經典錯誤與標準化重寫

     編輯:C 語言問答

原代碼六大硬傷

  1. 函數內重複聲明數組:int max(int a[10], int i) { int a[10]; ... } 遮蔽參數;
  2. 變量與函數同名:int max = a[0]; 與函數名 max 衝突;
  3. 參數聲明冗餘:int a[10] 退化為 int* a,寫 int a[] 或 int* a 更誠實;
  4. 調用時傳遞錯誤:max(a[10], i) 傳遞單個元素而非數組首地址,應為 max(a, 10);
  5. main 中使用未聲明變量:printf("...", max); 此處 max 既非變量也非函數返回值;
  6. printf 缺少格式符:printf("最大的數是:\n", max); 應為 printf("最大的數是: %d\n", max_val);。

標準化重寫版

#include <stdio.h>

// 只傳遞數組首地址與長度,不傳遞循環變量
int find_max(const int* arr, size_t len) {
    if (len == 0) return 0;  // 或報錯
    int max_val = arr[0];
    for (size_t i = 1; i < len; i++)
        if (arr[i] > max_val) max_val = arr[i];
    return max_val;
}

int main() {
    int a[10];
    printf("請輸入 10 個整數:\n");
    for (int i = 0; i < 10; i++) {
        if (scanf("%d", &a[i]) != 1) return 1;  // 輸入校驗
    }
    int max_val = find_max(a, 10);
    printf("最大的數是: %d\n", max_val);
    return 0;
}

進階泛化:支持任意類型比較


// 回調函數指針實現泛型比較
typedef int (*cmp_func)(const void*, const void*);

void* generic_max(void* base, size_t nmemb, size_t size, cmp_func cmp) {
    if (nmemb == 0) return NULL;
    char* p = (char*)base;
    void* max_elem = p;
    for (size_t i = 1; i < nmemb; i++) {
        p += size;
        if (cmp(p, max_elem) > 0) max_elem = p;
    }
    return max_elem;
}

// int 比較器
int cmp_int(const void* a, const void* b) {
    return (*(int*)a > *(int*)b) - (*(int*)a < *(int*)b);
}

這就是 qsort/bsearch 的設計思想,建議深入體會。

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