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

C 語言凱撒密碼指標實作:字母大小寫邊界正確處理

     編輯:程式設計綜合問答

題目要求

函式 `void Caesar(char *p, int k)`,將字串中每個字母向後移位 `k` 位 (循環),非字母不變。`k` 由鍵盤輸入。

原始碼邏輯錯誤


*p = (*p + k > 'z' && *p + k < 'A' || *p + k > 'Z') ? *p + k - 32 : *p + k;
// 問題:條件判斷混亂、大小寫邊界錯誤、非字母也進入運算、32 為 'a'-'A' 但邏輯反了

正確實作


#include 

void Caesar(char *p, int k) {
    k %= 26; // 移位數模 26,處理大 k
    for (; *p; p++) {
        if (isalpha(*p)) {
            char base = islower(*p) ? 'a' : 'A';
            *p = base + (*p - base + k) % 26; // 字母環狀移位
        }
    }
}

關鍵點解析

  1. `isalpha` 判斷字母,`islower`/`isupper` 區分大小寫。
  2. `base` 為 `'a'` (97) 或 `'A'` (65),將字母映射到 0~25 區間。
  3. `(*p - base + k) % 26` 完成環狀移位,再加回 `base` 得新字元。
  4. 非字母 (`!isalpha`) 直接跳過,保持原值。
  5. `k %= 26` 確保移位數在 0~25,避免溢位。

主程式範例


int main() {
    char a[500];
    int k;
    gets(a); // 注意:gets 不安全,教學用;實務用 fgets
    scanf("%d", &k);
    printf("明文:\n%s\n", a);
    Caesar(a, k);
    printf("密文:\n%s\n", a);
    return 0;
}

核心:以字母為基準 (base) 進行模 26 運算,統一處理大小寫與循環。

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