大学の課題で今シーザー暗号を作っています。
一様プログラムはできたのですが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:シーザー暗号
ありがとうございました。もう一つ質問があるのですが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;
}
#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:シーザー暗号
for 文内で、シフト対象外(英字以外)の文字はそのまま出力するようにすれば良いでしょう。
この場合なら、 strchr を使って先に table 内に含まれているかどうかをチェックし、
含まれていたらシフト処理を実行する方法が楽でしょう。
strchr は含まれていない文字があれば NULL を返すので、
*(strchr(table, *p) + y) はおかしなことになります。
(規約の方に書いていますが、出来るならソースコードはプレタグで囲ってください)
この場合なら、 strchr を使って先に table 内に含まれているかどうかをチェックし、
含まれていたらシフト処理を実行する方法が楽でしょう。
if(strchr(table,*p) != NULL){ // 含まれている }こんな感じで。
strchr は含まれていない文字があれば NULL を返すので、
*(strchr(table, *p) + y) はおかしなことになります。
(規約の方に書いていますが、出来るならソースコードはプレタグで囲ってください)