• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

segmentation fault - problem z lokalizacją naruszenia pamięci

0 głosów
307 wizyt
pytanie zadane 16 lutego 2017 w C i C++ przez niezalogowany

Witam. Jak w temacie mam problem ze zlokalizowaniem błędu segmentation fault. Wiem tylko tyle, że debugger zatrzymuje mi się w linii oznaczonej "►". Wrzuciłem tylko część kodu w której występuje błąd wszystko co potrzebne jest zawarte w tej części powyżej jest tylko ściągnięcie pewnych danych (część mało istotna nie sprawiająca problemu). Będę wdzięczny za każdą pomoc.

fstream dopis (nazwa.c_str(), ios_base::app);
        string nazwa_zakupionego;
        string cena;
        char pomoc;
        string tmp_str;                                     //tmp_str string powstający w celu zczytania interesujacej nas czesci ceny
        int cena_zl=0, cena_gr=0, dlugosc=0, j=0, tmp=0;    //tmp licba do funkcji atoi w celu zamiany stringa ceny na inta
        cout<<"Podaj nazwę zakupionego przedmiotu:\n";
        cin>>nazwa_zakupionego;
        cout<<"Podaj cenę:\n";
        cin>>cena;
        pomoc=cena[j];
        while (pomoc!='.'||pomoc!=',')
        {
            j++;
►           pomoc=cena[j];
        }
        tmp_str=cena[j+1]+cena[j+2];
        cena_gr = atoi(tmp_str.c_str());
        string tmp_string;
        while(tmp<j)
        {
            tmp_str=tmp_string+cena[j];
            tmp++;
        }
        cena_zl=atoi(tmp_string.c_str());
        dopis<<cena_zl<<"."<<cena_gr<<"\t"<<nazwa_zakupionego<<";"<<endl;
        dopis.close();

 

komentarz 16 lutego 2017 przez .kassad Gaduła (3,420 p.)
A jak dodasz ograniczenie, że j nie może być większe od strlen(cena) ?

1 odpowiedź

+1 głos
odpowiedź 16 lutego 2017 przez Piter10p Bywalec (2,750 p.)
edycja 16 lutego 2017 przez Piter10p

Noo, błąd jest dosyć logiczny inkrementujesz zmienną j do momentu, w którym wykracza ona poza tablicę "cena". Nie ma żadnego mechanizmu który by przerywał pętlę gdy osiągnie ostatni znak w "cena".

Lepiej było by użyć kodu:

for (j = 0; j < cena.size(); j++)
{
	if( cena[j] == '.' || cena[j] == ',' )
		break;
}

Poza tym w dalszej części kodu też będą występować te problemy. Powinieneś wprowadzić mechanizmy kontrolne.

I jeżeli chcesz wczytać liczbę z przecinkiem, polecam ten artykuł: https://4programmers.net/C/Konwersje_int_na_string_i_string_na_int#string-na-int

Pozdrawiam i życzę owocnej pracy wink

komentarz 16 lutego 2017 przez niezalogowany

Dzięki wielkie pomogłeś laugh, a znalazłem też błąd u siebie. Błąd głupi , ale ważne, że znaleziony: warunek do "while" zawsze prawdziwy( powinno być && a nie ||)=>pętla nieskończona i się sypie.

Podobne pytania

0 głosów
0 odpowiedzi 1,400 wizyt
0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 1 grudnia 2019 w C i C++ przez Aleksandra01 Użytkownik (530 p.)
+1 głos
1 odpowiedź 409 wizyt
pytanie zadane 17 lutego 2022 w C i C++ przez Yaqbek Nowicjusz (160 p.)

93,740 zapytań

142,675 odpowiedzi

323,294 komentarzy

63,319 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...