Q&A
問題となったc言語ファイル
c
1#include<stdio.h> 2int main(void){ 3 char c; 4 int n; 5 puts("いくつシフトさせますか?"); 6 scanf("%d",&n); 7 n %= 94; 8 while((c=getchar()) != '\n') { 9 if(c + n >126) { 10 c = 33 + n; 11 } 12 c+=n; 13 printf("%c",c); 14 } 15 puts(""); 16 return 0; 17}
問題
cc sizer1.c ./a.out いくつシフトさせますか? 1
よし、まずは1と入力してENTERだ!
...何も起きない
getcharさん?
'\n'のところがダメなのかな。EOFでやってみよう。
いくつシフトさせますか? 100 I LOVE TERATEIL &O&RU\K&ZKXGZKOR
入力の後になにか2行2列の行列のようなマークが入ってしまう。
Scanfで暗号の鍵となる値を入力してから、平文を入力して欲しい。。。
問題に至るまでの経緯(しょうもない雑談)
シーザー暗号を理解したぞ!英語だけだと大文字、小文字合わせて52文字しかないから
ASCIIコードの文字全てでやってみよう!
ASCII
133 0x21 ! 234 0x22 " 335 0x23 # 436 0x24 $ 537 0x25 % 638 0x26 & 739 0x27 ' 840 0x28 ( 941 0x29 ) 1042 0x2a * 1143 0x2b + 1244 0x2c , 1345 0x2d - 1446 0x2e . 1547 0x2f / 1648 0x30 0 1749 0x31 1 1850 0x32 2 1951 0x33 3 2052 0x34 4 2153 0x35 5 2254 0x36 6 2355 0x37 7 2456 0x38 8 2557 0x39 9 2658 0x3a : 2759 0x3b ; 2860 0x3c < 2961 0x3d = 3062 0x3e > 3163 0x3f ? 3264 0x40 @ 3365 0x41 A 3466 0x42 B 3567 0x43 C 3668 0x44 D 3769 0x45 E 3870 0x46 F 3971 0x47 G 4072 0x48 H 4173 0x49 I 4274 0x4a J 4375 0x4b K 4476 0x4c L 4577 0x4d M 4678 0x4e N 4779 0x4f O 4880 0x50 P 4981 0x51 Q 5082 0x52 R 5183 0x53 S 5284 0x54 T 5385 0x55 U 5486 0x56 V 5587 0x57 W 5688 0x58 X 5789 0x59 Y 5890 0x5a Z 5991 0x5b [ 6092 0x5c \ 6193 0x5d ] 6294 0x5e ^ 6395 0x5f _ 6496 0x60 ` 6597 0x61 a 6698 0x62 b 6799 0x63 c 68100 0x64 d 69101 0x65 e 70102 0x66 f 71103 0x67 g 72104 0x68 h 73105 0x69 i 74106 0x6a j 75107 0x6b k 76108 0x6c l 77109 0x6d m 78110 0x6e n 79111 0x6f o 80112 0x70 p 81113 0x71 q 82114 0x72 r 83115 0x73 s 84116 0x74 t 85117 0x75 u 86118 0x76 v 87119 0x77 w 88120 0x78 x 89121 0x79 y 90122 0x7a z 91123 0x7b { 92124 0x7c | 93125 0x7d } 94126 0x7e ~
ASCIIコードの文字は文字のとこだけだと94個。
94シフトさせると一周するからmod94だ!!
楽勝じゃん!!
そして問題へ。。。←死亡
ご協力感謝します
コードの改善や違った考え方等ご教授よろしくお願いします。
最終的目標は現代暗号を理解することです。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2019/01/20 10:58