void reverse (char s[]){
int len = strlen(s);
int j = len - 1;
for (int i = 0; i < j; i++,j--){
cout << s[i];
char ch = s[i];
s[i] = s[j]; //error line - giving exception, cannot write to the memory
s[j] = ch;
}
}
我正在使用Visual Studio 2008,我无法理解这里的问题是什么..:s ..我没有C ++实践:$。
答案 0 :(得分:11)
问题是它使用C风格的字符串而不是C ++样式字符串。特别是,您显然正在尝试写入常量字符串文字:
char const* str = "I cannot be written to";
C ++允许在此处省略const
以实现向后兼容,但文字仍然是常量。
最后,C ++已经有reverse
函数:
#include <algorithm>
#include <iostream>
#include <string>
int main() {
std::string str = "Hello world";
std::reverse(str.begin(), str.end());
std::cout << str << std::endl;
}
答案 1 :(得分:1)
我猜问题就是你如何调用它,可能是一个字符串文字,如:
reverse("This is a string");
或: char * string =“这是一个字符串”; 反向(字符串);
或其他一些小变化。在任何情况下,您都在尝试写入字符串文字,这会产生未定义的行为。
由于您显然使用的是C ++,我会考虑使用std::string
代替:
void reverse(std::string &s) {
int j=s.length()-1;
for (int i=0; i<j; i++, j--) {
// ..
}
}
答案 2 :(得分:0)
您是在const char*
还是字符串文字上调用此内容?
您是否正在尝试撤消
reverse("foo");
或
char *s = "foo";
reverse(s);
您需要从不可写的字符串创建一个新字符串,然后反转 。您可以使用strdup
。
char *s = strdup("foo");
reverse(s);
free(s, strlen(s));
另请注意,您的问题标记为c ++,因此您应该使用std::string
。