функция c для обратного преобразования строки не работает

#c

#c

Вопрос:

Просто изучаю c . Следующая функция — это моя попытка изменить строку (не работает, и я не знаю почему). Спасибо, что заметили мою глупость.

 #include <iostream>
using namespace std;

string r(string s)
{
    int len = s.length();
    for (int i = 0; i < len; i  )
    {
        char temp = s[i];
        s[i] = s[len - i];
        s[len - i] = temp; 
    }

    return s;
}

int main()
{
    cout << r("ASTRING");
}
  

Она изменяет первую букву строки на ' ' и выводит STRING

Комментарии:

1. Выполняйте реверсирование на бумаге или в отладчике. Какие элементы меняются местами на первой итерации цикла? Какие элементы меняются местами в последнем?

2. привет, возможно s[len - i] , это выходит за рамки первой итерации.

3. @Cool_Cornflakes std::reverse() уже делает это безопасным и надежным способом. Не изобретайте велосипед, особенно если он получается в виде квадрата.

4. Проблема в том, что вы проходите весь путь через строку. Вы должны остановиться на полпути, иначе вы поменяете их местами, а затем поменяете их местами, проходя вторую половину.

5. @Cool_Cornflakes Чтобы познакомиться с c , вам следует сосредоточиться на изучении возможностей, которые вы можете получить из стандартной библиотеки. Это более продуктивно, IMO. Также пошагово просматривайте свой код построчно с помощью отладчика. Вы обнаружите проблему довольно быстро.

Ответ №1:

Другой простой способ:

 string r(string s)
{
    int len = s.length();
    string temp;
    for (int i = len - 1; i > -1; i--)
    {
        temp.push_back(s[i]);
    }
    s = temp;
    return s; // or return temp;
}
  

Ответ №2:

Во-первых, string.length() возвращает длину, с '' которой означает конец строки, поэтому вам нужно удалить 1.
Во-вторых, вы не перемещаете всю строку целиком, вы должны остановиться на середине, i / 2 просто сделает это независимо от длины.

наконец :

 string r(string s)
{
    int len = s.length() - 1;
    for (int i = 0; i < len/2; i  )
    {
        char temp = s[i];
        s[i] = s[len - i];
        s[len - i] = temp;
    }

    return s;
}