Почему этот простой метод обращения строк в стиле C++ c вызывает исключение нарушения прав доступа?

Я работал с языком программирования Страуструпа C++, и у меня возникли трудности с ранним exersize. Задача состоит в том, чтобы создать метод rev, который переворачивает строку в стиле ac. Я думаю, что моя логика верна, но я получаю ошибку, когда пытаюсь изменить строку. Могу ли я не сделать это?

int strlen_(char* string)
{
    int count = 0;
    while (*string != '\0'){
        count ++;
        string ++;
    }

    return count;
}

void rev(char* string)
{
    //length of the string is going to be useful 
    int len = strlen_(string);

    //two counters, one going forward, one going back

    int forwardIndex = 0;
    int backwardIndex = len-1; 

    char temp;
    while (forwardIndex < backwardIndex){
        temp = string[forwardIndex];
        string[forwardIndex] = string[backwardIndex];   //Exception Here
        string[backwardIndex] = temp;
        forwardIndex--;
        backwardIndex--;
    }

}

void main()
{
    char* test = "test"; 
    rev(test);
}

2 ответа

Решение

Вы не можете изменять строковые литералы, а ваша обратная функция изменяет свой строковый аргумент.

Проверьте свою обратную функцию, передавая что-то вроде этого:

void main()
{
    char test[] = "test";
    rev(test);
}

Это сделает копию литеральной строки "test" в массиве, который вы можете изменить.

Кроме того, вы уменьшаете оба forwardIndex а также backwardIndex: вы должны увеличивать forwardIndex: forwardIndex++, По идее, индексы встретятся посередине.

Кажется, вы уменьшаете forwardIndex. После первого запуска будет -1. Ищу forwardIndex--; и изменить на forwardIndex++;

Другие вопросы по тегам