輸入 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 在運行時確定且可能較大的場景,避免棧溢出。