定義二維字符數組後,用 for 循環逐字符賦值,再用循環輸出每行,發現每行末尾都跟著一堆亂碼。
C 語言字符串以 空字符 '\0'(ASCII 0)作為結束標記。gets()、scanf("%s") 等庫函數讀取輸入時會自動在末尾補 '\0',但逐字符手動賦值不會自動添加結束符。輸出函數(如 printf("%s")、puts())會從起始地址連續讀取,直到遇到 '\0' 為止;若內存中殘留隨機數據,便會輸出亂碼。
在每行字符串最後一個有效字符後,顯式賦值 '\0':
char str[10][20];
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 19; j++) {
str[i][j] = getchar(); // 或其他賦值方式
if (str[i][j] == '\n') { // 以換行為結束示例
str[i][j] = '\0'; // 關鍵:手動加結束符
break;
}
}
// 若循環正常結束未遇換行,也需補 '\0'
if (j == 19) str[i][19] = '\0';
}
fgets()、scanf("%19s") 等安全函數,自動處理結束符與緩衝區溢出。'\0',並確保數組大小足夠容納結束符(長度 N 的字符串需開 N+1)。printf("%d ", str[i][j]))定位缺失 '\0' 的位置。記住:C 語言字符串 = 字符數組 + '\0' 結束符,少一個都不行。