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

C 語言凱薩密碼解密:字元位移邏輯錯誤導致無輸出結果

     編輯:程式設計綜合問答

程式碼嘗試實作「所有字母向前移動 5 位」的簡單解密,但執行無輸出。核心問題在於直接對字元減 5 而未處理字母邊界與大小寫,導致非字母字元(如逗號、空格)也被位移,產生不可見控制字元,終端機顯示異常或無輸出。

錯誤程式碼分析

a[i] = a[i] - 5; // 錯誤:未判斷是否字母,未處理循環

若輸入 a (ASCII 97),減 5 變 92 (\);大寫 A (65) 減 5 變 60 (<),皆非字母。且未處理 'a'~'e'、'A'~'E' 循環到 'z'/'Z' 的情況。

正確解密邏輯

  1. 僅處理字母:判斷 isalpha() 或範圍 'a'-'z'/'A'-'Z'。
  2. 分大小寫循環位移:
    • 小寫:c = (c - 'a' - 5 + 26) % 26 + 'a'
    • 大寫:c = (c - 'A' - 5 + 26) % 26 + 'A'
  3. 非字母保持原樣:逗號、空格、數字等直接複製。

修正後的解密函式

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 語言程式設計》第六章例題即為此類凱薩密碼,參考教材範例可快速掌握正確字元位移與邊界處理技巧。

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