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

C 語言結構體數組編程題通用解題框架與避坑指南

     編輯:程式設計綜合問答

典型題目特徵

輸入 N 個學生/員工/商品信息(多字段),要求:排序、查找、統計、篩選、輸出格式化。核心考點:結構體定義、數組操作、字符串處理、排序算法、輸入輸出格式控制。

標準解題模板

#include 
#include 
#include 

#define MAXN 1000
#define MAXLEN 50

typedef struct {
    char name[MAXLEN];
    int id;
    float score;
    // 根據題目擴展字段
} Record;

Record data[MAXN];
int n;

// 比較函數:按成績降序,成績同則按 id 升序
int cmp(const void *a, const void *b) {
    Record *p = (Record*)a, *q = (Record*)b;
    if (p->score != q->score) return (q->score > p->score) - (q->score < p->score); // 降序
    return p->id - q->id; // 升序
}

int main() {
    // 1. 讀取 n
    if (scanf("%d", &n) != 1) return 0;
    
    // 2. 循環讀取每條記錄
    for (int i = 0; i < n; i++) {
        // 注意:字符串可能含空格,需用 fgets 或掃描集
        scanf("%s %d %f", data[i].name, &data[i].id, &data[i].score);
    }
    
    // 3. 排序
    qsort(data, n, sizeof(Record), cmp);
    
    // 4. 輸出/統計/查找
    for (int i = 0; i < n; i++) {
        printf("%s %d %.2f\n", data[i].name, data[i].id, data[i].score);
    }
    return 0;
}

高頻陷阱與對策

陷阱現象解決方案
scanf 留下換行符後續 fgets/gets 讀到空行scanf 後加 getchar() 或用 scanf(" %[^\n]", str)
結構體對齊導致 sizeof 不符預期文件讀寫/網絡傳輸錯誤用 #pragma pack(1) 或逐字段序列化
字符串拷貝溢出緩衝區溢出、程序崩潰用 strncpy/snprintf,確保以 \0 結尾
浮點數比較精度排序/判等邏輯錯誤定義 EPS=1e-6,比較 fabs(a-b) < EPS
qsort 比較函數返回值錯誤排序結果不穩定/錯誤嚴格遵循:負/零/正 對應 < / = / >

進階技巧:動態內存管理版本

Record *data = malloc(n * sizeof(Record));
// ... 使用 ...
free(data);

適用於 n 在運行時確定且可能較大的場景,避免棧溢出。

調試建議

  1. 先寫輸入輸出骨架,用固定測試數據驗證邏輯
  2. 排序前後打印關鍵字段確認
  3. 邊界測試:n=0, n=1, 所有字段相同, 字段極值
  4. 用 Valgrind/AddressSanitizer 檢測內存錯誤
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved