質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1158閲覧

scanf関数からのgetchar関数

jointeratail

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/01/20 09:01

問題となった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だ!!
楽勝じゃん!!
そして問題へ。。。←死亡

ご協力感謝します

コードの改善や違った考え方等ご教授よろしくお願いします。
最終的目標は現代暗号を理解することです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

よし、まずは1と入力してENTERだ!

...何も起きない
getcharさん?

getcharさんは悪くない。

直前のscanf("%d",&n);で入力された改行がバッファに残っていて、
getcharさんはそれを返す。

だからwhile((c=getchar()) != '\n')を直ちに抜ける。

投稿2019/01/20 09:41

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jointeratail

2019/01/20 10:58

バッファについてのお勉強をしてきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問