アプリ版:「スタンプのみでお礼する」機能のリリースについて

大文字アルファベットの文字列を暗号化するプログラムを作りたいのですが、どうやったら暗号化するのかわかりません。
暗号化は文字をずらして行います。
ABC→BDF
Aは1文字目なので一文字ずらしてB
Bは2文字目なので二文字ずらしてD
Cは3文字目なので三文字ずらしてF
わからないのは文字のをどうやってずらすのかです。
ヒントだけでもいいので・・・

A 回答 (8件)

>わからないのは文字のをどうやってずらすのかです。


オフセット分だけ各文字に足して下さい。

Z はずらすと A に戻るの?

この回答への補足

ZはAに戻ります。
文字列は外から入力します。

補足日時:2007/11/02 20:13
    • good
    • 0

  // 暗号化する初期文字列


  char buf[] = "ABCDEFG";
  int n = 0;
  for ( n=0; buf[n] != '\0'; n++ ) {
    if ( buf[n] != 'Z' ) {
      // 文字列中の任意の位置の文字が 'Z'以外なら
      printf( "%C", buf[n]+1 );
    } else {
      // 文字列中の任意の位置の文字が 'Z'なら
      printf( "%C", 'A' );
    }
  }
と言った具合です
これを文字列に組上げれば良いですよ
あと想定以外の文字がきた場合の処理も必要かと思います
    • good
    • 1

すみません #2ですが


n番目の文字をn個ずらすと言うのを見落としていました

  // 暗号化する初期文字列
  char buf[] = "ABCDEFG";
  char c = 0;
  int n = 0;
  for ( n=0; buf[n] != '\0'; n++ ) {
    c = buf[n] - 'A';
    c += n + 1;
    c %= 26;
    c += 'A';
    printf( "%C", c );
  }
  printf( "\n" );
    • good
    • 1

Z越えの部分が引き切れてないよう思えます





char moji;
char result;

moji = 'D'; // 例)仮に暗号化対象の文字がDとする

int n = moji - 'A' + 1; // 何文字目かを取得
result = moji + n; // ずらす;

// Zを越えてしまう上位13文字について
if(result > 'Z') {
result -= 26; // 一周させる
}

printf("%c\n", result); // 答え



NO.2さんのループ部分と組み合わせて使って下さい
    • good
    • 0

#include <stdio.h>



int main(void)
{
char *upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int c, i;

while((c = getchar()) != '\n'){
for(i = 0; upper[i]; i ++){
if(c == upper[i]){
c = upper[((i + 1) * 2) % 26];
break;
}
}
putchar(c);
}
return 0;
}
    • good
    • 0

 訂正。


c = upper[((i + 1) * 2) % 26] -> c = upper[(i * 2 + 1) % 26]
    • good
    • 4

#include <stdio.h>



int main(void)
{
int c, i;

while((c = getchar()) != '\n'){
i = c - 'A' + 1;
if(0 < i && i < 27) c = 'A' + (i * 2 - 1) % 26;
putchar(c);
}
return 0;
}
    • good
    • 0

#include <stdio.h>



int main(void)
{
int c;

while((c = getchar()) != EOF){
if('A' <= c && c < 'Z') c = 'A' + ((c-'A') * 2 + 1) % 26;
putchar(c);
}
return 0;
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!