1

nullで終了する文字列(nullで終了するchar文字列、それは冗長ですか?)の逆関数を実装したかったのでchar*、次の解決策を思いつきました。

逆関数の最後のスワップswap(&tmp, &str)は効果がありません。理由は何ですか、おそらくそれはどのように行われますか?

備考:文字列自体、一時文字、インデックスのみを使用して逆関数をすでに再実装しましたが、なぜこれが機能しないのか非常に興味があります。このポインタの問題で私は何を考慮していませんか?

#include <stdlib.h>
#include <stdio.h>

int strlen(char* str)
{
        int len = 0;
        char* ptr = str;
        while (ptr[0] != '\0')
        {
                len++;
                ptr++;
        }

        return len;
}

void swap(char **a, char **b)
{
        char* c = *a;
        *a = *b;
        *b = c;
}


void reverse(char* str)
{
        int len = strlen(str);
        char* tmp = malloc(sizeof(char) * (len + 1));
        int i;
        for (i = 0; i < len; i++)
        {
                tmp[i] = str[len - 1 - i];
        }

        tmp[len] = '\0';
        // printf(tmp); => "wolfrevOkcatS olleH"
        swap(&tmp, &str);
}

int main(int argc, char** argv)
{
        char* str = "Hello Stackoverflow\0";
        reverse(str);
        printf("%s", str);
        return 0;
}
4

1 に答える 1

5

インプレースリバースを実行するだけで、実行しているポインタースワップは必要ありません。

void reverse(char* str, int len)
{ 
        int i;
        for (i = 0; i < len; i++)
        {
                char tmp = str[i];
                str[i] = str[len - 1 - i];
                str[len - 1 - i] = tmp;
        }
}

あなたの質問に答えるには、関数に a を渡す必要がありchar**ますreverse。これは、それが指すものを変更しているためであり、ポインターはvalue によってコピーされるため、pointee の変更を反映する場合は、二重ポインターが必要です。

于 2012-09-20T11:54:15.973 に答える