这个c ++反向字符串函数有什么问题

时间:2010-06-25 15:24:49

标签: c++ string

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 ++实践:$。

3 个答案:

答案 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