Problem z segmentation fault


(klonmarcin) #1

witam, mam taki program:

http://wklej.to/jU5h

i jak uruchamiam to wyświetla mi się segmentation fault

uruchamiam na konsoli w linuxie, pomóżcie co zrobiłem źle ??


(=VND=) #2

tu masz błąd

while (!isdigit(c));

popraw na

while (!isdigit(c[loop++]));

i wcześniej zdefiniuj zmienną int loop=0;

po co ograniczenie do pięciu cyfr skoro tablicę zdekalarowałeś na sto?

po co w ogóle pętla do-while? przecież i tak sprawdzasz wszystkie cyfry.

może to część czegoś większego - nie wnikam :wink:


(klonmarcin) #3

zadeklarowałem na sto tak dla testów, a pętla do-while jest po to, gdy user wprowadzi ciąg nie będący liczbą to bez wychodzenia z programu będzie można wprowadzić ponownie poprawnie, tak masz rację jest to część większego programu.

dzięki i sprawdzę czy działa.

dokładnie to program ma wychodzić z pętli tylko wtedy gdy wszystkie znaki wprowadzone przez usera są liczbami, jeśli choć jedna znak z ciągu nie jest cyfrą to powtarzamy pętle, właśnie po to jest zmienna licznik.

:slight_smile: :slight_smile:


(=VND=) #4

OK ale..

-atof zwraca typ double, więc zmienna licznik powinna być właśnie tego typu.

-sizeof© da Ci zawsze 100, atof nie wykona się gdy nie wpiszesz 100 cyfr.

-while(isdigit(c[loop++]) będzie sprawdzać cały wprowadzony ciąg tyle razy ile jest w nim cyfr, marnotrawstwo czasu :slight_smile:

-napis "Wprowadzony ciąg nie jest liczbą!..." pojawi się tyle razy, ile znaków nie rozpoznanych jako cyfry masz łańcuchu. Lepiej przerwać for.

-zapomniałeś wyzerować licznik wewnątrz while (dla kolejnej liczby)

dodałem zmienną bool zakoncz, gdy = true pętla przerywa działanie (liczba poprawna)

ja bym to tak widział.

int main(int argc, char *argv[])

{

char c[100];

int licznik;

double liczba;

bool zakoncz=false;

do{

    licznik=0;

    printf("\nPodaj pierwsza liczbe - Maksymalnie 5 cyfr: ");

    scanf("%s", c);

    for (int i = 0; i < strlen(c); i++)

      {

       if(isdigit(c[i]))

          licznik++;

       else {printf("Wprowadzony ciąg nie jest liczbą! Wpisz liczbę\n");break;}

      }

     if (licznik == strlen(c)) { liczba = atof(c); zakoncz=true;}

} while (!zakoncz); [/code]

([alex]) #5

Czy nie prościej zamiast tej całej gmatwaniny napisać:

int Tmp;double liczba;

(klonmarcin) #6

rozwiązałem już to w taki sposób, znalazłem to sieci:

do {

		printf("\nPodaj pierwszą liczbę - Maksymalnie 5 cyfr : ");// wczytanie danych

		scanf("%s", d);

		if (strlen(d) > 5)

			{printf("Podałeś za długą liczbę!\n");} 

		czytoliczbafloat = (float)strtof(d, &endptr, 10);

			if(*endptr != 0) { printf("Nie wprowadziłeś liczby!\n");}

			else {

				DANE.a = atof(d);

			     }

	} while (*endptr != 0 || strlen(d) > 5);[/code]

co najważniejsze działa także dla liczb ujemnych

:slight_smile: