【问题标题】:Why does this pointer swap fail in string reverse?为什么此指针交换在字符串反转中失败?
【发布时间】:2012-09-20 11:47:15
【问题描述】:

我想为以空结尾的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;
}

【问题讨论】:

  • 您不需要在字符串末尾添加尾随 '\0'。这是在使用 "String" 时隐含的(例如运行 sizeof("A")
  • @mnunberg 是的,但是在reverse 函数中添加空字符是正确的[必需?]

标签: c string pointers


【解决方案1】:

你可以做一个就地反转,你不需要你正在做的那个指针交换:

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 函数,因为您正在更改它将指向的内容,并且指针是按值复制的,所以如果你想反映指针的变化你需要一个双指针。

【讨论】:

  • 我知道,事实上这就是我现在正在使用的解决方案,但是我的代码在最后一步失败的解释是什么?
猜你喜欢
  • 2013-01-26
  • 2012-12-14
  • 2020-05-24
  • 2013-03-06
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2011-12-12
  • 2019-05-09
相关资源
最近更新 更多