из-за чего ошибка *** stack smashing detected ***: terminated

при вводе строки "A RozA upala Na lapu AzoR" выдаёт ошибку *** stack smashing detected ***: terminated. Из-за чего это может происходить? Вот код:

#include <iostream>
using namespace std;

int main()
{
    string s, p, s2;
    getline(cin,s);

    int i = 0, n = s.length(),k = 0, sch = 0;

    k = s.length() - 1;

    for(i=0;i<n;i++){
        s2[sch] = s[k];
        k--;
        sch++;
    }

    for(i=0;i<n;i++){
        if(s[i] == s2[i]){
            p = "Yes";
        }
        else{
            p = "No";
        }
    }
    cout << p;

    return 0;
}

Ответы (1 шт):

Автор решения: Harry

s2 изначально пустая строка. Таким образом, присваивание

s2[sch] = s[k];

запихивает данные куда-то*, куда нельзя, и вполне может портить стек...

Добавьте строку

for(i=0;i<n;i++)
{
    assert(sch < s2.length());
    s2[sch] = s[k];

и убедитесь сами :)

Если вы так странно проверяете строку на палиндромность, то хотя бы добавьте что-то вроде s2=s или как-то иначе инициализируйте ее.

Но проще проверять палиндромность иначе...

Например, если уж обращать строку и тратить память - то

string s, s2;
getline(cin,s);
s2 = s;
reverse(s2.begin(),s2.end());
cout << ((s == s2) ? "Yes" : "No");

Не тратить память и время -

string s;
bool p = true;
getline(cin,s);
for(int i = 0, j = s.size() - 1; i < j; ++i, --j)
    if (s[i] != s[j]) { p = false; break; }
cout << (p ? "Yes" : "No");

или то же через итераторы...

→ Ссылка