为什么这个指针交换在字符串反向中失败?

时间:2012-09-20 11:47:15

标签: c string pointers

我想为空终止的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;
}

1 个答案:

答案 0 :(得分: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;
        }
}

要回答您的问题,您需要将char**传递给reverse函数,因为您正在更改它指向的内容,并且指针会按值复制 ,所以如果你想反映指针的变化,你需要一个双指针。