0

質問は次のとおりです。

ポインター演算を使用して次の暗号を解きます。指定された文字列は GKQTEHIN です。ポインタを定義し、この文字列の文字 'T' に設定します。弦を前後にトラバースします。1 から 5 までの 1 つの値 (キー) を各文字に加算/減算して、この暗号を解き、意味のある単語を形成します。ヒント: これを解決する際に使用します。

うまくいけば、これは正しく行われました...

char given[]="GKQTEHIN";
char *pointer; 
pointer=&given[3];

pointer-=3;
printf("%c", *pointer-4);

pointer+=1;
printf("%c", *pointer+4);

pointer+=1;
printf("%c", *pointer-4);

pointer+=1;
printf("%c", *pointer-4);

pointer+=1;
printf("%c", *pointer+4);

pointer+=1;
printf("%c", *pointer+4);

pointer+=1;
printf("%c", *pointer-4);

pointer+=1;
printf("%c\n\n", *pointer+4);

「COMPILER」の文字が印字されています。

4

4 に答える 4

0

「各アルファベットに単一の値を加算/減算する」にはどうすればよいですか?

コンピューターではすべてが数値である (または数値と見なすことができる) ため、コンピューターは数値のみを理解して操作します。これは、文字が実際には内部的に数字であることを意味します。charin C はASCII encodingを使用します。これにより、各文字が数字に対応します。したがって、それを表すコードにキーを追加するだけですchar。数として問題なく使えますchar

char a = 'a';
a++;
printf("%c\n", a); // prints 'b'
于 2013-11-07T15:03:18.240 に答える
0

come char に何らかの値を追加するには、以下を使用します。ループすることで、文字列全体に対してこれを行うことができます。

int main()
{
    char ch = 'a';  // or some other character
    int x = 2;  // or some other value
    ch = (ch - 'a' + x) % 26 + 'a';  // make sure you have a value between 'a' and 'z'

    printf("%c\n", ch); // prints 'c'
}
于 2013-11-07T15:08:11.957 に答える
0

ここで 2 つの概念を適用する必要があります。

1つ目は、 内のいずれかの文字のアドレスpointerを含む変数です。given[]

これに 1 を加えると、次の文字を指します。そこから 1 を引くと、前の文字を指します。

ただし、配列の境界内に保持する必要があります。そのpointerため、 より小さい&given[0](または、最初の要素のアドレスにも評価される ) ことはありません。また、文字列の末尾にgivenある null 文字 ( ) を指している場合は、インクリメントを停止する必要があります。これを行うには、反復ごとにインクリメントし、null 文字を指しているときに にリセットして境界を処理し、再び にヒットすると停止\0するループを作成します。pointerpointergivenT

2 つ目は、指し示す*pointer文字です。pointer

を足したり引いたりして文字を変えることができます(*pointer)。たとえば、( と同じ) に初期化pointerしたので、文字 を指します。そうなるでしょう、そしてなるでしょう。新しいキャラクターを保存したい場合は、次のように書くことができます&given[3]given + 3T(*pointer) + 1U(*pointer) - 2R

*pointer = (*pointer) - 2;

あるいは単に

(*pointer) -= 2;

また、アルファベットの「端から落ちる」ことにも注意が必要です。たとえば、(*pointer) + 7の後の文字になりZますが、おそらく「ラップアラウンド」して に戻す必要がありAます。これを行う最も簡単な方法は、26 if *pointer > 'Z'(アルファベットには 26 文字があるため) を引くか、26 if を足すことです*pointer < 'A'。モジュラス演算子 ( %) を使用することもできますが、それはより複雑です。


それをすべてまとめると:

  • -5 から 5 の間の定数値を常に追加することがわかっています。
  • 文字列内のすべての文字に値を追加して結果を出力することで、各値をテストします。

これを行うアルゴリズムは次のとおりです。

  1. key-5 から 5 まで実行される変数 (たとえば、 ) を使用してループを作成します。
  2. ループ内で、given最初の文字列にリセットします。
  3. また、ループ内で、次の2 番目のループを 作成します。
    1. に初期化pointerしますgiven + 3
    2. keyの値を の文字に追加します*pointer
    3. pointer反復ごとに増分
    4. pointernull 文字にヒットすると文字列の先頭に戻り、
    5. pointerに戻ると停止しgiven + 3ます。

コードの書き方はお任せします。行き詰まった場合は、質問を自由に更新してください。作成したコードを追加することを忘れないでください。

幸運を!

于 2013-11-07T15:50:48.327 に答える