我正在尝试在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;
}
}
}
提前感谢您的大力帮助。
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
std::reverse(str, str + std::char_traits<char>::length(str));
请注意,反转字符串会导致许多语言和编码的文本损坏。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
我能够使用你的反向方法没有问题,见下文。问题必须在于你如何使用你传入的char *。
int main()
{
char str[] = "Hello World!";
reverse(str);
cout << str << endl;
return 0;
}
这是输出
!dlroW olleH
答案 4 :(得分:0)
我认为你这样称呼它
char* mystr = "Hello";
reverse(mystr);
正确?但是你不能这样做,因为反向修改了导致访问冲突的字符串(参见here)。如其他人使用
建议的那样调用它char mystr[] = "Hello";
reverse(mystr)
据说其他人建议使用std :: reverse是一个更好的解决方案。
答案 5 :(得分:0)
另一种方法,如果您不喜欢/想要迭代器或反向函数。
string revStr(string str){
if (str.length() <= 1) {
return str;
}else{
return revStr(str.substr(1,str.length()-1)) + str.at(0);
}
}