witam, mam taki program:
i jak uruchamiam to wyświetla mi się segmentation fault
uruchamiam na konsoli w linuxie, pomóżcie co zrobiłem źle ??
witam, mam taki program:
i jak uruchamiam to wyświetla mi się segmentation fault
uruchamiam na konsoli w linuxie, pomóżcie co zrobiłem źle ??
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
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.
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
-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]
Czy nie prościej zamiast tej całej gmatwaniny napisać:
int Tmp;double liczba;
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