Что не так с этой функцией обратной строки c ++ - PullRequest
2 голосов
/ 25 июня 2010
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 Studion 2008, и я не могу понять, в чем здесь проблема ..: s .. Я не практикую в C ++: $.

Ответы [ 3 ]

11 голосов
/ 25 июня 2010

Проблема в том, что он использует строки в стиле 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 голос
/ 25 июня 2010

Я думаю, проблема в том, как вы это называете, возможно, с помощью строкового литерала, что-то вроде:

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--) {
        // ..
    }
}
0 голосов
/ 25 июня 2010

Вы вызываете это для const char* или строкового литерала?

Пытаетесь ли вы изменить

reverse("foo");

или

char *s = "foo";
reverse(s);

Вы будетенужно создать новую строку из незаписываемой и заменить на .Вы можете использовать strdup.

char *s = strdup("foo");
reverse(s);
free(s, strlen(s));

Также обратите внимание, что ваш вопрос помечен тегом c ++, поэтому вам, вероятно, следует использовать std::string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...