1

我想为一个以空字符结尾的char*字符串(以空字符结尾的字符字符串,那是多余的吗?)实现一个反向函数,并提出了以下解决方案。

反向函数中的最终交换swap(&tmp, &str)没有任何效果。是什么原因,大概是怎么做的?

备注:我已经通过仅使用字符串本身、临时字符和索引重新实现了 reverse 函数,但我对为什么这不起作用很感兴趣。在这个指针问题中我没有考虑什么?

#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复制的,因此如果您想反映指针的更改,您需要一个双指针。

于 2012-09-20T11:54:15.973 回答