ページ 11

シーザー暗号

Posted: 2009年1月23日(金) 12:34
by あつし
大学の課題で今シーザー暗号を作っています。
一様プログラムはできたのですがprintf("3と入力してください: ");で3と入力せずに3こづらしたいのですがどのようにこのプログラムを改良すればよいですか?

  

 #include <stdio.h>

  #include <string.h>


 char *shift_char(char x[/url], int y){

 static const char table[/url] =

 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

 "abcdefghijklmnopqrstuvwxyz"

 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

 "abcdefghijklmnopqrstuvwxyz";

 static const int table_len = (sizeof(table)-1) / 2;

 char *p;

 y %= table_len;


 for(p=x;*p;p++)

 *p = *(strchr(table, *p) + y);

 return x;

 }

 int main(void){

  char input[301];

  int count;

  printf("アルファベットを入力してください: ");

  scanf("%s", input);

  printf("3と入力してください: ");

  scanf("%d", &count);

    printf("%s", shift_char(input, count));

  return 0;

}

Re:シーザー暗号

Posted: 2009年1月23日(金) 12:42
by 御津凪
printf("%s", shift_char(input, 3));
これで良いのでは?

Re:シーザー暗号

Posted: 2009年1月23日(金) 13:01
by あつし
ありがとうございました。もう一つ質問があるのですがabc100と printf("アルファベットを入力してください: "); の所に入力すると、defと3桁シフトはするのですが100という数字が表示されません。3桁シフトして、数字はそのままにするにはどうしたらよいですか?




#include <stdio.h>

  #include <string.h>


 char *shift_char(char x[/url], int y){

 static const char table[/url] =

 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

 "abcdefghijklmnopqrstuvwxyz"

 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

 "abcdefghijklmnopqrstuvwxyz";

 static const int table_len = (sizeof(table)-1) / 2;

 char *p;

 y %= table_len;


 for(p=x;*p;p++)

 *p = *(strchr(table, *p) + y);

 return x;

 }

 int main(void){

  char input[301];

  int count;

  printf("アルファベットを入力してください: ");

  scanf("%s", input);

  printf("%s", shift_char(input, 3));

  printf("%s", shift_char(input, count));

  return 0;

}

Re:シーザー暗号

Posted: 2009年1月23日(金) 13:19
by 御津凪
for 文内で、シフト対象外(英字以外)の文字はそのまま出力するようにすれば良いでしょう。

この場合なら、 strchr を使って先に table 内に含まれているかどうかをチェックし、
含まれていたらシフト処理を実行する方法が楽でしょう。
if(strchr(table,*p) != NULL){
    // 含まれている
}
こんな感じで。

strchr は含まれていない文字があれば NULL を返すので、
*(strchr(table, *p) + y) はおかしなことになります。

(規約の方に書いていますが、出来るならソースコードはプレタグで囲ってください)

Re:シーザー暗号

Posted: 2009年1月23日(金) 18:06
by 通りすがり
老婆心ながら、「一様」とは「様子が同じであるさま」のことです。
「ひとまず」「とりあえず」の意味で使うのは
「一応(いちおう)」です。