0

私は通常、再帰をかなりよく理解していますがstrcpy、ポインターのようなC関数に慣れていないため、この再帰がどのように文字列を反転させるかを理解できませんでした。

char *reverse(char *string)
{
    if (strlen(string) <= 1)
        return string;

    else
    {
        char temp = *string;

        strcpy(string, reverse(string+1));

        *(string+strlen(string)) = temp;

        return string;
    }
}

このstrcpy部分は私には少し複雑に思えますが、この行の目的は何
*(string+strlen(string)) = temp;ですか?

文字列を反転した後、文字列の最初から最後にある文字を追加する必要があることはわかっていますが、このコードの背後にあるロジックを理解しているかどうかはわかりません。

4

3 に答える 3

2

このコードは非常に非効率的ですが、その機能は次のとおりです。

  1. 元の最初の文字を保存します
  2. 文字列の残りの部分を再帰的に反転します(文字列string+1の2番目の文字へのポインタです)。
  3. 残りの(反転した)文字列を1文字左にコピーします。
  4. 元の最初の文字を最後に置きます(*(string+strlen(string)) = temp;)。

は、それが理解しやすい場合*(string+strlen(string)) = temp;と同等です。string[strlen(string)] = temp;

このコードは非常に非効率的であるため、使用することはお勧めしません。スタックスペースの無駄は言うまでもなく、すべての反復で文字列全体をコピーします(そしてその長さを2回測定します)。

はるかに優れた実装は次のとおりです。

void reverse(char *s) {
  char *e = s+strlen(s)-1;
  while (e > s) {
    char tmp = *s;
    *s=*e;
    *e=tmp;
    s++; e--:
  }
}
于 2012-09-30T17:08:30.837 に答える
0

*(string+strlen(string)) = tempいわゆるポインタ演算です-そのコードは。と同等string[strlen(string)] = tempです。したがって、これにより一時文字が文字列の最後に配置されます。reverse()は引数と同じ長さの文字列を返すため、文字列はゼロで終了したままであることに注意してください。

これreverse(string+1)もポインタ演算です。今回は-と同じですreverse(&string[1])。つまり、reverse()は2番目の文字以降の文字列をミラーリングしますが、strcpy()は文字列の先頭に配置し、 tempに格納されている最初の文字を上書きします。文字列の最後に置きます。

ただし、全体的なコードは不必要に複雑で非効率に見えるので、それから物事を行う方法についてのレッスンを描く前に、よく考えます。

于 2012-09-30T17:05:42.033 に答える
0

これがコードの仕組みです。入力文字列は、最初の文字と残りの文字の2つの部分に分割されます。最初の文字はに格納されtemp、残りは再帰呼び出しによって逆になります。再帰呼び出しの結果は結果の最初に配置され、の文字tempは最後に配置されます。

string is [1234567890]

temp is 1, string+1 is [234567890]

reverse(string+1) is [098765432], temp is 1

strcopy行は、の先頭から結果をコピーする部分reverse(string+1)stringあり、の末尾から*(string+strlen(string)) = tempコピーする部分です。tempstring

于 2012-09-30T17:24:36.230 に答える