首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言字符串數組輸出亂碼?別忘了手動添加結束符 '\0'

     編輯:C 語言問答

問題現象

定義二維字符數組後,用 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)。
  • 調試時可打印字符 ASCII 碼(printf("%d ", str[i][j]))定位缺失 '\0' 的位置。

記住:C 語言字符串 = 字符數組 + '\0' 結束符,少一個都不行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved