1

我正在尝试在 Visual Studio 2008 中运行以下代码。但在运行时程序抛出错误

reverseString.exe 中 0x002e1480 处未处理的异常:0xC0000005:访问冲突写入位置 0x002e573c。

void reverse(char *str)
{
    char *end = str;
    char tmp;
    if (str)
    {
      while (*end)
      {
         ++end;
      }
      --end;

      while (str < end) 
      {
        tmp = *str;
        *str++ = *end; // Error Here
        *end-- = tmp;
      }
   }
}

提前感谢您的大力帮助。

4

6 回答 6

2

反转字符串很简单:

if (str) {
    std::reverse(str, str + strlen(str));
}

然而,这种反转工作的前提是str指向一个可写的字符串,即它被声明为char*并且不是从字符串文字初始化的!尽管可以使用字符串文字来初始化char*对象,但它们不一定指向可写内存(在许多当代系统上,它们并不指向可写内存)。

如果你想知道一个天真的实现std::reverse()会是什么样子:

template <typename BiDirIt>
void reverse(BiDirIt begin, BiDirIt end) {
    for (; begin != end && begin != --end; ++begin) {
         swap(*begin, *end);
    }
}
于 2013-08-25T03:48:35.480 回答
1
std::reverse(str, str + std::char_traits<char>::length(str));

请注意,反转字符串会导致许多语言和编码的文本损坏。

于 2013-08-25T03:49:07.447 回答
1

这是从头开始的方法

#include <iostream>

void reverse(char* input)
{
    int size = strlen(input);
    int half = size / 2;

    for(int i = 0; i < half; ++i)
    {
        char temp = input[size - i - 1];
        input[size - i - 1] = input[i];
        input[i] = temp;
    }
}

int main()
{
    char word[] = "hello";
    reverse(word);
    std::cout << word;
}
于 2013-08-25T04:00:33.213 回答
0

我能够毫无问题地使用您的反向方法,见下文。问题一定出在您如何使用传入的 char* 。

int main()
{
    char str[] = "Hello World!";

    reverse(str);

    cout << str << endl;

    return 0;
}

这是输出

!dlroW olleH
于 2013-08-25T04:00:32.953 回答
0

我想你是这样称呼它的

char* mystr = "Hello";
reverse(mystr);

对?但是您不能这样做,因为 reverse 正在修改导致访问冲突的字符串(请参见此处)。像其他人建议的那样使用它来调用它

char mystr[] = "Hello";
reverse(mystr)

按照其他人的建议使用 std::reverse 是一个更好的解决方案。

于 2013-08-25T04:19:45.100 回答
0

另一种方法,如果您不喜欢/不想要迭代器或反向函数。

 string revStr(string str){
        if (str.length() <= 1) {
            return str;
        }else{
            return revStr(str.substr(1,str.length()-1)) + str.at(0);
        }
    }
于 2013-08-25T05:01:23.683 回答