問題代碼
char a[3] = {'0','0','0'}; // 初始化為字符 '0' (ASCII 48)
scanf("%s", a); // 讀入 "A" → a={'A','\0',?} 但第三字節非\0
printf("%c\n", a[2]); // 亂碼
原因
- `scanf("%s")` 讀取字符串,**自動在末尾追加 `\0`**。
- 輸入 `"A"` → `a[0]='A'`、`a[1]='\0'`、`a[2]` 保持初始值 `'0'`(非 `\0`)。
- `printf("%c", a[2])` 輸出 `'0'`(視覺上像亂碼);若後續按字符串處理,會越界讀取。
修正
char a[3] = {'\0', '\0', '\0'}; // 或 char a[3] = {0}; / char a[3] = "";
scanf("%2s", a); // 限制寬度防溢出
// 現在 a 保證以 \0 結尾,安全
最佳實踐
- 字符數組**初始化為全 0**(`{0}` 或 `""`),確保 `\0` 終止符存在。
- `scanf` **必須限制寬度** `%2s`(大小-1),防緩衝區溢出。
- 現代 C++ 推薦 `std::string` + `std::cin >> str`,自動管理內存、無長度限制。