正確初始化語法
// 1. 編譯期常量初始化 (推薦)
char arr[2][5] = { "1111", "2222" }; // 自動補 \0,實際各佔 5 字節
// 2. 運行期 strcpy 逐行複製
char arr[2][5];
strcpy(arr[0], "1111");
strcpy(arr[1], "2222");
// 3. 讀取輸入 (安全)
for (int i = 0; i < 2; i++) {
scanf("%4s", arr[i]); // 寬度限制防溢出
}
輸出遍歷模板
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 5; j++) {
printf("%c ", arr[i][j]); // 逐字符輸出含 \0
}
putchar('\n');
}
// 或直接輸出字串
for (int i = 0; i < 2; i++) {
printf("%s\n", arr[i]);
}
常見錯誤與修正
| 錯誤代碼 | 問題 | 修正 |
char a[2][5] = {"1111", "2222"}; 後 a[0] = "new"; | 陣列名非左值,不可整體賦值 | 用 strcpy(a[0], "new"); |
scanf("%s", a); | 將整個二維陣列當作一維,導致資料連續寫入越界 | scanf("%4s", a[i]); 逐行讀取 |
printf("%s", a); | %s 期望 char*,傳入 char(*)[5] 類型不匹配 | printf("%s", a[i]); |
動態分配版 (行長不固定)
char **arr = malloc(rows * sizeof(char*));
for (int i = 0; i < rows; i++) {
arr[i] = malloc(cols * sizeof(char));
strcpy(arr[i], source[i]);
}
// 釋放
for (int i = 0; i < rows; i++) free(arr[i]);
free(arr);