0

このアルゴリズムがオンラインで文字列を反転するのを見てきましたが、コードの最後で指定するアルゴリズムについて疑問があります。

    void reverseString(char *original_string)
    {
        char *end = original_string;
        char tmp;

        if(original_string) {
            while(*end) {
                ++end;
            }
            --end;
            while (original_string < end) {
                tmp = *original_string;
                *original_string++ = *end;
                *end-- = tmp;
            }
        }
//This line doesn't have the complete reversed string. Why?
printf("%s\n", original_string);
    }

1)whileループで...なぜ2つのポインターを比較するのですか?値が大きくなったり小さくなったりすることをどうやって知ることができますか?それらは単なるポインタですよね?

2)何も返さないのはなぜですか?逆の文字列はどこにありますか?逆の文字列がoriginal_stringにあることを示唆している場合、効果が外部スコープにあるように、ポインターへのポインターを使用するべきではありませんか?

3)次のことを行う場合:

char test[] = "hello";
    reverseString(test);
    printf("%s\n", test);

「オレ」が見えます。ただし、printf("%s\n", original_string);関数reverseStringの最後の行で実行すると、「leh」が表示されます。何故ですか?

4

1 に答える 1

4

セクションの最初と最後を指す2つのポインターが残っています。各ステップで、これらのポインターが指す文字を入れ替えてから、開始と終了の両方向から反転するように残されている文字列を減らします。ポインタを比較することには、次の意味があります。間隔の開始が間隔の終了の後でなくなるまで、逆にする間隔があります。それが理にかなっていることを願っています。

何も返す必要はありません。文字列が逆になり、引数が同時に出入りします。

3)関数では、実行中に変更する文字列へのポインタのコピーを取得します。これにより、ポインタが最後の行で変更されると、文字列の先頭ではなく、中央を指すようになります。それが最後に残されているところ。

于 2013-01-23T17:25:42.247 に答える