三個實驗:初始化 `char w0[2]={'a','a'}` 輸出亂碼;`scanf("%2s", w1)` 輸入 `aa` 輸出正常;函式內 `scanf` 後 `printf` 又亂碼。
核心差異
- **初始化**:只給字元,無 `\0`,`printf("%s")` 讀到記憶體隨機資料直到遇 `\0`。
- **手動輸入**:`scanf("%2s")` 讀 2 字元後**自動補 `\0`**(標準規定),且使用者按 Enter 產生 `\n` 留在緩衝區,但 `%s` 已停止讀取。
- **函式內 `scanf` 後亂碼**:實驗 3 中 `sub1` 的 `w1` 是區域陣列,**未初始化**,`scanf("%2s")` 寫入 2 字元 + `\0`(共 3 位元組),但陣列大小只有 2,**緩衝區溢位**破壞棧幀,導致後續 `printf` 行為未定義。
教訓
- 字串陣列大小 **≥ 最大長度 + 1(給 `\0`)**。
- `scanf("%Ns")` N 應為 `size-1`。
- **字串結束符 `\0` 是第一約束**,非陣列大小。