輸入字串進行大小寫轉換後,輸出結果後面多出一行亂碼。將 while(c[i]) 改為 while(i < sizeof(c)) 後正常,但想知道原理。
區域變數 char c[256], d[256]; 未顯式初始化,內容為隨機值(垃圾資料)。輸入字串長度遠小於 256 時,陣列剩餘位置仍存放隨機值。while(c[i]) 以 c[i] != 0 作為結束條件,因隨機值極大機率非 0,導致迴圈越界讀取,輸出亂碼甚至崩潰。
char c[256] = {0}, d[256] = {0};
int len = strlen(c);
for (int i = 0; i < len; ++i) { ... }
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;
}
\\0 或長度為界,勿依賴未初始化記憶體。<ctype.h> 標準庫函數,避免硬編碼 ASCII 差值(32),提升可移植性。