-3

为什么它不起作用?编译器说它返回的本地地址。任何帮助如何使它正确。我看到了其他反向字符串程序,但我没有发现任何问题。

#include<stdio.h>
#include<string.h>

char *reverse(char *str);

void main()
{
    char str[]="jamesbond";
    int len=strlen(str);
    char *ptr;
    ptr=reverse(str);
    printf("the reversed string is :%s",ptr);
}

char *reverse(char *str)
{ 
    int i,j;
    int len=strlen(str);
    char qtr[len];

    for( i=len-1;i<=0;i--)
    { 
        for( j=0;j<len-1;j++)
            qtr[j]=*(str+i);
    }
    return qtr;
}
4

5 回答 5

0

从函数返回堆栈变量(或数组)(此处qtr)是未定义的行为。它将被覆盖。

解决方案是malloc()返回数组并将其返回,然后free()在您完成使用它时返回。

于 2013-01-24T17:59:26.370 回答
0

qtr是一个本地数组,并且您正在返回一个指向它的指针。你不能那样做。您需要分配动态内存并返回:

char *qtr = malloc(len + 1);

请注意,您有时会需要free()此内存。或者,只需在原地进行反转:

char *start = str;
char *end = str + strlen(str) - 1;
char tmp;

while (start < end)
{
   tmp = *start;
   *start++ = *end;
   *end-- = tmp;
}
于 2013-01-24T17:59:38.040 回答
0

qtr 正在堆栈上分配。一旦你的函数返回,内存就会超出范围。您可以将 qtr 声明为 static 作为解决方法。

于 2013-01-24T17:59:58.077 回答
0

第一个 for 循环的条件必须更改为

i >= 0



for( i=len-1;i>=0;i--)
  { for( j=0;j<len-1;j++)
    qtr[j]=*(str+i);

   }

而且由于您没有将指针传递给结果数组。

qtr 最好 malloc

qtr = malloc(sizeof(strlen(str));

 int len=strlen(str);

在您的 main() 中是不需要的计算。

于 2013-01-24T18:04:52.510 回答
0

我在某处找到了这段代码。看起来合法。如果你不想破坏你输入的字符串,只需深度复制指针(memcpy())并将其插入。

char* strrev( char* s)
  {
  char  c;
  char* s0 = s - 1;
  char* s1 = s;

  /* Find the end of the string */
  while (*s1) ++s1;

  /* Reverse it */
  while (s1-- > ++s0)
    {
    c   = *s0;
    *s0 = *s1;
    *s1 =  c;
    }

  return s;
  }
于 2013-01-24T18:33:55.943 回答