Mam taki sobie kod, i główkuje dlaczego dostaje seg faulta. Z tego jak rozumiem dokumentacje SV powinien być tutaj niemożliwy. Kolejny raz mi sie to już zdarza, wcześniej po prostu użyłem innej metody; ale chciałbym w końcu zrozumieć co jest nie tak.
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
int nLines;
cin >> nLines;
while(nLines--)
{
string line;
cin >> line;
// erase spaces and punctuations
for(auto st = line.begin(); st != line.end(); st++)
{
if(*st == ' ' || *st == ',' || *st == '.')
{
st = line.erase(st);
}
}
cout << line << endl;
}
return 0;
}
Funkcja erase według dokumentacji zwraca albo iterator wskazujacy na znak ktory jest obecnie w miejscu usunietego znaku albo string::end.
Wiec jeżeli st jest równe string::end to dereferencja iteratora nie powinna miec miejsca, kod powinien wyskoczyc z pętli. A jezeli st nie jest równe string::end to dereferencja iteratora nie powinna powodowac seg faulta.
To jest moje rozumienie tego jak działają te funkcje, i nie widze jak to jest możliwe, że mimo to dostaje seg fault. Ktoś może mi to wytłumaczyć?
Program wywala sie na lini:
st = line.erase(st);
Seg fault wystepuje dla inputu:
1
test, Test