ここで 2 つの概念を適用する必要があります。
1つ目は、 内のいずれかの文字のアドレスpointer
を含む変数です。given[]
これに 1 を加えると、次の文字を指します。そこから 1 を引くと、前の文字を指します。
ただし、配列の境界内に保持する必要があります。そのpointer
ため、 より小さい&given[0]
(または、最初の要素のアドレスにも評価される ) ことはありません。また、文字列の末尾にgiven
ある null 文字 ( ) を指している場合は、インクリメントを停止する必要があります。これを行うには、反復ごとにインクリメントし、null 文字を指しているときに にリセットして境界を処理し、再び にヒットすると停止\0
するループを作成します。pointer
pointer
given
T
2 つ目は、指し示す*pointer
文字です。pointer
を足したり引いたりして文字を変えることができます(*pointer)
。たとえば、( と同じ) に初期化pointer
したので、文字 を指します。そうなるでしょう、そしてなるでしょう。新しいキャラクターを保存したい場合は、次のように書くことができます&given[3]
given + 3
T
(*pointer) + 1
U
(*pointer) - 2
R
*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
反復ごとに増分
pointer
null 文字にヒットすると文字列の先頭に戻り、
pointer
に戻ると停止しgiven + 3
ます。
コードの書き方はお任せします。行き詰まった場合は、質問を自由に更新してください。作成したコードを追加することを忘れないでください。
幸運を!