ここで 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 の間の定数値を常に追加することがわかっています。
- 文字列内のすべての文字に値を追加して結果を出力することで、各値をテストします。
これを行うアルゴリズムは次のとおりです。
key-5 から 5 まで実行される変数 (たとえば、 ) を使用してループを作成します。
- ループ内で、
given最初の文字列にリセットします。
- また、ループ内で、次の2 番目のループを
作成します。
- に初期化
pointerしますgiven + 3。
keyの値を の文字に追加します*pointer。
pointer反復ごとに増分
pointernull 文字にヒットすると文字列の先頭に戻り、
pointerに戻ると停止しgiven + 3ます。
コードの書き方はお任せします。行き詰まった場合は、質問を自由に更新してください。作成したコードを追加することを忘れないでください。
幸運を!