• ベストアンサー

暗号文の質問です

暗号文をつくろうとしてつくったのですが、 暗号文をつくることはできたのですが 暗号を元に戻す操作のプログラムを作るのができません。 本のヒントで暗号化を行うか、復号化を行うかはプログラムの開始時点で整数値を入力することにより指定(0を入力すると暗号化、1を入力すると復号化)するらしいです。なんかうまくいかないので教えてもらえるとうれしいです。 #include<stdio.h> int main(void) { char line[100]; int ix; while(gets(line) !=NULL) { ix =0; while(line[ix] !='\0') { if(line[ix]>='A'&&line[ix]<='Y' || line[ix]>='a'&&line[ix]<='y') line[ix] ++; else if(line[ix]=='Z'|| line[ix]=='z') line[ix] =25; ix++; } printf("%s\n",line); } }

質問者が選んだベストアンサー

  • ベストアンサー
  • togino
  • ベストアンサー率75% (97/129)
回答No.2

> 2.Zまたはzの場合はAsciiコードで25の文字 > ただしこのままだとZかzの入力が分からないですね。 これはですね。たぶん、hiro999911 さんが > line[ix] =25; って入力されている部分 line[ix] -= 25; の間違いだと思います。'Z'-'A' がちょうど 25 ですし。 'Z' --> 'A' と 'z' --> 'a' にしようとしていると 考えられます。 --- 復元化プログラムは if(line[ix]>='B'&&line[ix]<='Z' ||  line[ix]>='b'&&line[ix]<='Z')  line[ix] --; else if(line[ix]=='A'|| line[ix]=='a')  line[ix] +=25; ix++; になります。 このプログラムと、質問文にある暗号化プログラムを プログラムの先頭で 「暗号かけますか?復元しますか?」と聞かせて その問いによって分岐すれば、おっけ~です。 # まさか、「プログラムの開始時点で整数値を # 入力することにより指定」というこの部分の # プログラムが分からないんじゃないですよね (^^;) # お使いの本でも省略されているくらい簡単って # ことですよ。

hiro999911
質問者

補足

とってもありがとうございます。 line[ix] -= 25の部分は気づきませんでした。 復号化プログラムを入れてやってみたのですが error C2018: 文字 '0x81' は認識できません。 error C2018: 文字 '0x40' は認識できません。 error C2018: 文字 '0x81' は認識できません。 error C2018: 文字 '0x40' は認識できません。 error C2018: 文字 '0x81' は認識できません。 error C2018: 文字 '0x40' は認識できません。 とでてしまいました。 このエラーの意味もわからずがんばって調べてます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.1

>暗号化を行うか、復号化を行うかはプログラムの開始時点で整数値を入力することにより指定(0を入力すると暗号化、1を入力すると復号化)するらしいです。 そんな仕組みはこのコードを見る限りありませんが。 暗号化ロジックは 1.A-Y,a-yのとき+1(例:b->c,J->K) 2.Zまたはzの場合はAsciiコードで25の文字 ですね。復号化はこの逆のロジックでいいはずです。 ただしこのままだとZかzの入力が分からないですね。 >なんかうまくいかないので どうやって上手く行かないのかぐらいは書いたほうがいいと思います。

hiro999911
質問者

補足

>暗号化を行うか、復号化を行うかはプログラムの開始時点で整数値を入力することにより指定(0を入力すると暗号化、1を入力すると復号化)するらしいです これはこの機能もつけろみたいなかんじでした。 復号化のプログラムとは関係なかったです。 暗号化ロジックの特徴がよくわかりました。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • while文を使った問題なのですが・・

    はじめまして。 C言語初心者です。 while文のところまでやっとたどり着きましたが、次の問題がどうしても解くことができません。 ********************** 整数を入力し、入力された整数の数だけ「*」を横一列に表示し、最後に改行するプログラムを while 文を使って作りなさい。 但し、0または負の値が入力された場合は、「*」は表示せず、改行のみを表示すること。 ********************** #include<stdio.h> int main(void) { int a; scanf("%d", &a); while(a!==0){ printf("%d*\n", a); } } こんな感じでつくってみたのですが、whileの条件部分がさっぱり分かりません。 int a の数字文だけ、*で表示する、というのも方法が思いつきません。 アドバイス、お願いいたします。

  • IF文 教えてください (BASIC)

    1, 2, 3, 4 のいずれかの値を取る3つの乱数 x, y, z を同じ行に表示させ,さらに x=y=z=1 のときは「大当」, x=y=z≠1 のときは「当」, x, y, z のうち2つだけが一致したときは「惜」, 上記以外の場合は「残念」 と表示するプログラム ELSEIF文を用い,IF文およびEND IF文は1回で済ませる。 乱数x,y,zを表示することと IF文が分かりません。 RANDOMIZE FOR n=1 TO 3       PRINT INT (RND*4)+1; NEXT n

  • 暗号化文 3択させるためのプログラム 何で??

    忙しい中失礼します。下記のプログラムをいじり、「欲しい動作」を完成させたい、と思っています。 ・・・が出来ないのです。 どうか教えて下さい。お願いします。 アドバイスでもいいです。お願いします。 欲しい動作 1.ユーザーに3択 [1ENCRYPT(暗号化)/2DECRYPT(標準化)/3QUIT(中止)] を尋ねる 2.ユーザーが1(ENCRYPT)を選択した場合、次に文章を入力し、 THE FOX BROWN エンターキー WKH IRA EURZQ 表示[暗号化:元の文字から3文字ずらして表示] というように表示させるプログラムを作成しています。 質問:ユーザーに尋ねる3択方法なのですが、どういったプログラムを組めば、1選択後にTHE・・・のような文章を入力後→エンターキー→暗号文といった動作が得られるのでしょうか? 私のプログラムでは、DOS画面上でどういうわけか 1 を選択した後、直ぐ(文章を入力することなく)、Press・・・continue となってしまいます。 何で??です? どこをどういじれば、希望する動作になるのでしょうか? お願いします。 私のプログラムは以下です。 #include <stdio.h> #include <stdlib.h> int main() { void mystery(char); char sen; int num1; printf("What do you want? Select the number\n"); printf(" 1.encrypt Cange decryption letters into encryption letters\n"); printf(" 2.decrypt Cange encryption letters into decryption letters\n"); printf(" 3.quit You don't need to write letters.\n"); printf("Enter the number: "); scanf("%d", &num1); if(num1 == 1) { printf("You select encrypt.\n"); printf("Enter your sentence: "); mystery(sen); } else if(num1 == 2) { printf("You select decrypt.\n"); } else { printf("You don't do anything.\n"); } system("pause"); return 0; } void mystery(char sen) { char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int c, i; int j=0; while((c = getchar()) != '\n') { for(i = 0; upper[i]; i++) { if(c == upper[i]) { c = upper[(i + 3) % 26]; break; } } if(j<20) putchar(c); j++; } }

  • c言語の難しい問題について

    (c言語の問題) 下記のプログラムを完成させ、キーボードから文字列を読み込み、-1文字ずらすことによって暗号化を行うプログラムを作りなさい。ただし、ピリオド、空白などはそのままにするようにすること。 例)this is a pen. sghr hr @ qdm. #include<stdio.h> #define CHAR_NUM 256 void angou( I ) { II } int main(void) { unsigned char text[CHAR_NUM]; char moji; int i; puts("暗号化する文字を入力しなさい。"); while((moji=getchar()) !=EOF){ text[i]=moji; i++; } angou(text i); printf("%s",text); return(0); } I、IIに入る文を書きなさい。 私はIには「char x[],int y」 IIには 「if('A'<x[i]<'Z' && 'a'<x[i]<'z') int j; for(j=0;j<y;j++) x[j]=x[j]-1 else」 といれたのですが、出力がうまくでません。どうすればいいのですか?

  • 数値の多い順に別々の処理をする場合

    例えば $a = int rand(100); $b = int rand(100); $c = int rand(100); $d = int rand(100); $e = int rand(100); $f = int rand(100); $z = 5; $y = 10; という風にして、$aの数値が一番多い時は「$z + $y」を、$bの数値が一番多い時は「$z - $y」を、と数値を多い順に変数の数だけ別々の処理をしたいときはどうすれば良いのでしょうか? 数日前から気になっていて、初心者なもんでif文やwhile文で地道に長いプログラムしか答えが思いつきません>_< 短くする方法などありましたらどなたか教えてくださいm(_ _)m

    • ベストアンサー
    • Perl
  • while文とif文

    #include <stdio.h> void main() { char str[2][6] = {"hello","lop"}; int i = 0; while(i < 2){ printf("%s\n", str[i++]); } } 上のプログラムの条件判定の部分にif文を つかうとhelloという文字列しか出力されず while文を使うとhelloとlop 二つ出力され ます。上の条件判定のif文にした時ととwhile 文にした時の違いはどこなのでしょうか?? どなたかご教授よろしくお願いしますm(_ _)m

  • 大学の授業で作った暗号化プログラムが動きません。

    下記のような暗号化プログラムを作成したのですが動きません。 問題のある場所は36行目(/で囲まれた行)で式の構文エラーと診断されたのですが、どう直せばいいのか分かりません。 どなたかどうすればよいのかお教え下さい。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int anngou (int c, char b[81]) { while (c <= 81) { if(b[c] >= 'a' && b[c] <= 'z') { if(b[c] >= 'a' && b[c] <= 'm') { b[c] = b[c] + 13; } else { b[c] = b[c] - 13; } } else { if(b[c] >= 'A' && b[c] <= 'Z') { if(b[c] >= 'A' && b[c] <= 'M') { b[c] = b[c] + 13; }else{ b[c] = b[c] - 13; } } } } return b[c]; } int main(void) { int a, c; char b[81]; a = c = 0; while (a <= 9) { printf("Input some words: "); fgets(b, 81, stdin); /b[c] = anngou(char b[c]);/ c = 0; while (c <= 81) { printf("%s", b[c]); c++; } printf("\n"); a++; } exit(0); }

  • Cの問題について。

    下の問題の時、 y、zが入力された時に暗号化された文字をa、bへ戻す方法がわかりません。 わかる方がいたら、ヒントだけでもいいので、よろしくお願いします。 適当な1文字を入力し、それが元が何であったかが分からないように何文字かずらして暗号化し、また元に戻すようなプログラムを作りなさい。文字としては英字小文字のみと仮定します。 例を以下に示します。作成するプログラムも同じような出力形式にしてください。 [ 例 ] 入力文字 = x 暗号化された文字 = b 復号化された文字 = x 何文字ずらすか?については、各自で適当に設定して構いません。 ただし、暗号化された文字も、英字小文字でなければなりません。 例えば、zに2を足すと、そのままでは英字でない記号になってしまいますが、これを z+1 -> a, z+2 -> b, z+3 -> c, … のようにアルファベットの先頭に戻してやる処理が必要です。 この点を工夫して下さい。 #include <stdio.h> void main(){ char moji; int a; printf("入力文字:"); scanf("%c",&moji); a=2; moji += a; printf("暗号化された文字= %c \n",moji); moji -= a; printf("複合化された文字= %c \n\n",moji); }

  • C言語のプログラムについて質問

    明解C言語という書籍に 大きい方を表示するプログラム #include <stdio.h> int maxof(int x, int y) {  if (x > y)   return (x);  else   return (y); } int main(void) {  int na, nb;  puts("二つの整数を入力してください。");  printf("整数1:"); scanf("%d", &na);  printf("整数1:"); scanf("%d", &na);  printf("大きいほうの値は%dです。\n", maxof(na, nb));  return (0); } の関数maxofを利用し、 int max4(int w, int x, int y, int z) {  return (maxof(maxof(w, x), maxof(y, z))); } を挿入して変えれば四つの整数から最大値を求められるとのことですが、 コンパイルがうまくいきません。 関数maxofのwとx,yとzをそれぞれ比較し最大値を求めてさらにmaxof(w, x)とmaxof(y, z)を比較して最大値を求めるということですよね?ですので、 maxof(w, x) {  if (w > x)   return (w);  else   return (x); } maxof(y, z) {  if(y > z)   return (y);  else   return (z); を挿入しようとしたらmaxofはすでにありますというようなことが表示されてだめでした。 また、 int maxof(maxof(int w, int x), maxof(int y, int z)) { if (w > x)   return (w); if (w < x)   return (x); if (y > z)   return (y); if (y < z)   return (z); if (maxof(w, x) > maxof(y, z))   return (maxof(w, x)); if (maxof(w, x) < maxof(y, z))   return (maxof(y, z)); } としてみましたがやはりだめでした。 前のページの説明を読み返したりネットで調べてもわかりませんでした。 何がわからないのかがわからないのでもうお手上げです。 長くなってすいません プログラム例と説明をお願いします。

  • C言語で簡単暗号

    C言語を初めてけっこう立つんですが。 自分なりにソフトを作ってみました 暗号化、解読ができるソフトです 1.暗号化 2.解読 3.Quit ソースは #include <stdio.h> int main(void) { int i; char da; back: modo: do{ printf("1.angouka\n"); printf("2.kaidoku\n"); printf("3.Quit\n"); scanf("%d",&i); }while(i<1 || i>3); if(i==1){ da=getchar(); while(da){ printf("%c",da+1); da=getchar(); if(da=='.'){ goto modo; } } } else if(i==2){ da=getchar(); while(da){ printf("%c",da-1); da=getchar(); if(da=='.'){ goto back; } } } return 0; } なんですが。感想などここはこうした方が良いなどと教えてもらいたいんですが。 もっと簡潔にかけて破かれにくい暗号を書くにはどうしたらいいでしょう 教えて下さい