#include <stdio.h>
#include <string.h>
#define SIZE 1000 // 入力可能な最大文字数
// (a) アルファベットかどうかを判定
int isalphabet(char c) {
return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
}
// (b) アルファベットを n 文字ずらす
char caesar(char c, int n) {
if (c >= 'A' && c <= 'Z') {
return 'A' + ( (c - 'A' + n + 26) % 26 );
} else if (c >= 'a' && c <= 'z') {
return 'a' + ( (c - 'a' + n + 26) % 26 );
} else {
return c; // アルファベットでない文字はそのまま
}
}
int main() {
char input[SIZE];
char encrypted[SIZE];
char decrypted[SIZE];
int n;
// 文字列とシフト量の入力
printf("暗号化したい文字列を入力してください: "); fgets(input
, SIZE
, stdin
); input
[strcspn(input
, "\n")] = '\0'; // 改行文字を除去
printf("シフト量(正の整数)を入力してください: ");
// 暗号化処理
for (int i = 0; input[i] != '\0'; i++) {
encrypted[i] = caesar(input[i], n);
}
encrypted
[strlen(input
)] = '\0';
// 復号化処理(-n で元に戻す)
for (int i = 0; encrypted[i] != '\0'; i++) {
decrypted[i] = caesar(encrypted[i], -n);
}
decrypted
[strlen(encrypted
)] = '\0';
// 結果表示
printf("暗号化された文字列: %s\n", encrypted
); printf("復号化された文字列: %s\n", decrypted
);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCiNkZWZpbmUgU0laRSAxMDAwICAvLyDlhaXlipvlj6/og73jgarmnIDlpKfmloflrZfmlbAKCi8vIChhKSDjgqLjg6vjg5XjgqHjg5njg4Pjg4jjgYvjganjgYbjgYvjgpLliKTlrpoKaW50IGlzYWxwaGFiZXQoY2hhciBjKSB7CiAgICByZXR1cm4gKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpOwp9CgovLyAoYikg44Ki44Or44OV44Kh44OZ44OD44OI44KSIG4g5paH5a2X44Ga44KJ44GZCmNoYXIgY2Flc2FyKGNoYXIgYywgaW50IG4pIHsKICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewogICAgICAgIHJldHVybiAnQScgKyAoIChjIC0gJ0EnICsgbiArIDI2KSAlIDI2ICk7CiAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CiAgICAgICAgcmV0dXJuICdhJyArICggKGMgLSAnYScgKyBuICsgMjYpICUgMjYgKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGM7IC8vIOOCouODq+ODleOCoeODmeODg+ODiOOBp+OBquOBhOaWh+Wtl+OBr+OBneOBruOBvuOBvgogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGNoYXIgaW5wdXRbU0laRV07CiAgICBjaGFyIGVuY3J5cHRlZFtTSVpFXTsKICAgIGNoYXIgZGVjcnlwdGVkW1NJWkVdOwogICAgaW50IG47CgogICAgLy8g5paH5a2X5YiX44Go44K344OV44OI6YeP44Gu5YWl5YqbCiAgICBwcmludGYoIuaal+WPt+WMluOBl+OBn+OBhOaWh+Wtl+WIl+OCkuWFpeWKm+OBl+OBpuOBj+OBoOOBleOBhDogIik7CiAgICBmZ2V0cyhpbnB1dCwgU0laRSwgc3RkaW4pOwogICAgaW5wdXRbc3RyY3NwbihpbnB1dCwgIlxuIildID0gJ1wwJzsgIC8vIOaUueihjOaWh+Wtl+OCkumZpOWOuwoKICAgIHByaW50Zigi44K344OV44OI6YeP77yI5q2j44Gu5pW05pWw77yJ44KS5YWl5Yqb44GX44Gm44GP44Gg44GV44GEOiAiKTsKICAgIHNjYW5mKCIlZCIsICZuKTsKCiAgICAvLyDmmpflj7fljJblh6bnkIYKICAgIGZvciAoaW50IGkgPSAwOyBpbnB1dFtpXSAhPSAnXDAnOyBpKyspIHsKICAgICAgICBlbmNyeXB0ZWRbaV0gPSBjYWVzYXIoaW5wdXRbaV0sIG4pOwogICAgfQogICAgZW5jcnlwdGVkW3N0cmxlbihpbnB1dCldID0gJ1wwJzsKCiAgICAvLyDlvqnlj7fljJblh6bnkIbvvIgtbiDjgaflhYPjgavmiLvjgZnvvIkKICAgIGZvciAoaW50IGkgPSAwOyBlbmNyeXB0ZWRbaV0gIT0gJ1wwJzsgaSsrKSB7CiAgICAgICAgZGVjcnlwdGVkW2ldID0gY2Flc2FyKGVuY3J5cHRlZFtpXSwgLW4pOwogICAgfQogICAgZGVjcnlwdGVkW3N0cmxlbihlbmNyeXB0ZWQpXSA9ICdcMCc7CgogICAgLy8g57WQ5p6c6KGo56S6CiAgICBwcmludGYoIuaal+WPt+WMluOBleOCjOOBn+aWh+Wtl+WIlzogJXNcbiIsIGVuY3J5cHRlZCk7CiAgICBwcmludGYoIuW+qeWPt+WMluOBleOCjOOBn+aWh+Wtl+WIlzogJXNcbiIsIGRlY3J5cHRlZCk7CgogICAgcmV0dXJuIDA7Cn0=