из-за чего ошибка *** 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");
или то же через итераторы...