• 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

Object Storage Arubacloud
0 głosów
127 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 864 wizyt
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 1 grudnia 2019 w C i C++ przez Aleksandra01 Użytkownik (530 p.)
+1 głos
1 odpowiedź 209 wizyt
pytanie zadane 17 lutego 2022 w C i C++ przez Yaqbek Nowicjusz (160 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...