请告知这个字符串反转功能有什么问题?

时间:2010-03-26 23:17:14

标签: c++ string

此代码正在编译清理。但是当我运行它时,它会在第9行给出异常“访问冲突写入位置”。

void reverse(char *word)
{
int len = strlen(word);
len = len-1;
char * temp= word;
int i =0;
while (len >=0)
{
word[i] = temp[len];  //line9
++i;--len;
}
word[i] = '\0';
}

7 个答案:

答案 0 :(得分:7)

您是否在调试器中完成了此代码?

如果没有,当i(从0增加)通过len(向0减少)时会发生什么?

请注意,您的两个指针wordtemp具有相同的值 - 它们指向相同的字符串。

答案 1 :(得分:4)

注意:并非C ++程序中的所有字符串都是可写的。即使您的代码很好,当有人用字符串文字调用它时,它仍然会崩溃。

答案 2 :(得分:3)

len变为0时,您将访问字符串开头之前的位置(temp[0-1])。

答案 3 :(得分:2)

试试这个:

void reverse(char *word)
{
  size_t len = strlen(word);
  size_t i;

  for (i = 0; i < len / 2; i++)
    {
      char temp = word[i];
      word[i] = word[len - i - 1];
      word[len - i - 1] = temp;
    }
}

答案 4 :(得分:1)

该函数看起来不会崩溃,但它无法正常工作,它将从word [-1]读取,这不太可能导致崩溃,但这是一个问题。您的崩溃问题可能是您传入了编译器放入只读数据段的字符串文字。

这样的事情会在许多操作系统上崩溃。

char * word = "test";
reverse(word); // this will crash if "test" isn't in writable memory

您的算法也存在一些问题。您有len = len-1以及之后的temp[len-1]这意味着永远不会读取最后一个字符,而当len == 0时,您将从之前的第一个字符中读取。另外,temp和word都是指针,因此它们都指向相同的内存,我认为你的意思是创建一个 copy 的单词,而不仅仅是指向word的指针的副本。您可以使用strdup复制word。如果你这样做,并用len修复你的一个一个问题,那么你的函数应该可以工作,

但是仍然无法修复写入崩溃,这是由您未向我们展示的代码引起的。

哦,如果您使用strdup,请务必在离开此功能前致电free以免费temp

答案 5 :(得分:0)

嗯,首先,当len == 0 len-1为负数时。这非常违法。其次,你的指针很可能指向一个未保留的内存区域。

答案 6 :(得分:0)

如果你按照以下方式调用该函数:

reverse("this is a test");

然后至少有一个编译器将传入一个只读字符串,因为你可以向后兼容C语言 将字符串文字作为非const char *传递。