函式 `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; // 字母環狀移位
}
}
}
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 運算,統一處理大小寫與循環。