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

C 語言字元陣列大小寫轉換輸出亂碼?未初始化陣列惹的禍

     編輯:程式設計綜合問答

問題現象

輸入字串進行大小寫轉換後,輸出結果後面多出一行亂碼。將 while(c[i]) 改為 while(i < sizeof(c)) 後正常,但想知道原理。

根本原因

區域變數 char c[256], d[256]; 未顯式初始化,內容為隨機值(垃圾資料)。輸入字串長度遠小於 256 時,陣列剩餘位置仍存放隨機值。while(c[i]) 以 c[i] != 0 作為結束條件,因隨機值極大機率非 0,導致迴圈越界讀取,輸出亂碼甚至崩潰。

正確做法

  1. 初始化陣列:
    char c[256] = {0}, d[256] = {0};
    
  2. 或使用 strlen 控制迴圈:
    int len = strlen(c);
    for (int i = 0; i < len; ++i) { ... }
    
  3. 手動添加結束符(原碼已做 c[i] = '\0';,但 d 陣列未加)。

改良版程式碼

#include <stdio.h>
#include <ctype.h>  // 使用 islower, isupper, tolower, toupper 更可移植

int main() {
    char c[256] = {0}, d[256] = {0};
    int i = 0, ch;

    printf("請輸入字串: ");
    while ((ch = getchar()) != '\n' && i < 255) c[i++] = ch;
    c[i] = '\0';

    for (int j = 0; j < i; ++j) {
        if (islower(c[j])) d[j] = toupper(c[j]);
        else if (isupper(c[j])) d[j] = tolower(c[j]);
        else d[j] = c[j];
    }
    d[i] = '\0';

    printf("原始: %s\n轉換: %s\n", c, d);
    return 0;
}

關鍵點總結

  • C 語言區域陣列預設不初始化,必須手動歸零。
  • 字串處理務必以 \\0 或長度為界,勿依賴未初始化記憶體。
  • 善用 <ctype.h> 標準庫函數,避免硬編碼 ASCII 差值(32),提升可移植性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved