程式碼嘗試實作「所有字母向前移動 5 位」的簡單解密,但執行無輸出。核心問題在於直接對字元減 5 而未處理字母邊界與大小寫,導致非字母字元(如逗號、空格)也被位移,產生不可見控制字元,終端機顯示異常或無輸出。
a[i] = a[i] - 5; // 錯誤:未判斷是否字母,未處理循環
若輸入 a (ASCII 97),減 5 變 92 (\);大寫 A (65) 減 5 變 60 (<),皆非字母。且未處理 'a'~'e'、'A'~'E' 循環到 'z'/'Z' 的情況。
isalpha() 或範圍 'a'-'z'/'A'-'Z'。c = (c - 'a' - 5 + 26) % 26 + 'a'c = (c - 'A' - 5 + 26) % 26 + 'A'void jiemi(char a[]) {
for (int i = 0; a[i]; i++) {
char c = a[i];
if (c >= 'a' && c <= 'z')
a[i] = (c - 'a' - 5 + 26) % 26 + 'a';
else if (c >= 'A' && c <= 'Z')
a[i] = (c - 'A' - 5 + 26) % 26 + 'A';
// 非字母不變
}
}
原程式 scanf("%s", c) 以空白分隔讀取,無法處理含空格的字串。建議改用 fgets() 讀整行,或在迴圈中逐字元讀取直到換行。題目要求「遇到 start 開始、end 列印、ENDINPUT 結束」的狀態機邏輯也需仔細處理緩衝區殘留換行符。
《譚浩強 C 語言程式設計》第六章例題即為此類凱薩密碼,參考教材範例可快速掌握正確字元位移與邊界處理技巧。