代碼嘗試從文件讀取單詞對構建字典鏈表,第二次循環讀取時在 p->le[i] = str[i]; 處崩潰。
i、j 未在每行處理前重置// 錯誤代碼片段
int i, j; // 僅在 main 開頭初始化為 0
while (fgets(str, 100, fp) != NULL) {
while (str[i] != ' ') { // 第二行時 i 已經是上一行的結束值
p->le[i] = str[i]; // 直接越界寫入
i++;
}
// ...
}
while (fgets(str, 100, fp) != NULL) {
int i = 0, j = 0; // 關鍵:每行重置
// 解析英文單詞
while (str[i] != ' ' && str[i] != '\0' && str[i] != '\n') {
if (i < 29) p->le[i] = str[i]; // 防止緩衝區溢出
i++;
}
p->le[i] = '\0';
// 跳過空格
while (str[i] == ' ') i++;
// 解析中文翻譯
while (str[i] != '\n' && str[i] != '\0' && str[i] != '\r') {
if (j < 129) p->tran[j] = str[i];
i++; j++;
}
p->tran[j] = '\0';
// 插入鏈表邏輯...
}
| 問題 | 風險 | 修復 |
|---|---|---|
p = pre->link; pre = p; 邏輯顛倒 | 鏈表斷裂,僅保留最後一個節點 | 用尾插法:pre->next = p; pre = p; |
未檢查 malloc 返回值 | 內存不足時解引用空指針 | 每次分配後判空 |
固定緩衝區 char str[100] 可能截斷長行 | 數據丟失 | 動態分配或增大緩衝區 |
| 文件編碼可能為 UTF-8 含 BOM | 首行讀取異常 | 跳過 BOM 或用 fopen(..., "r, ccs=UTF-8") |
在 IDE 設置斷點於 while (fgets...) 循環開始,觀察 i、j、str 內容,第二次迭代時即可發現 i 未歸零。