spragniony_wiedzy napisał(a)
char szukaj(char *zdanie)
{
char *wsk , tab[20];
int i;
wsk = strstr(buff,"Ala") + strlen("Ala");
Co to jest "buff"? Gdzie masz deklarację tego? :D
spragniony_wiedzy napisał(a)
while(strncmp(" ", wsk, 1))
Jeśli strstr() zwróci Ci NULL (jak nie znalazł "Ala" w buff), dostaniesz w tym miejscu SEGFAULT.
Dodatkowo, jeśli "Ala" wystąpi na końcu buff, następnym znakiem będzie bajt zerowy, wynikiem strncmp() będzie 1 i - niespodzianka - będziesz sobie radośnie iterował po pamięci za buff (albo dostaniesz SEGFAULT).
spragniony_wiedzy napisał(a)
{
tab[i] = *wsk;
i++;
wsk++;
}
tab[i] = '\0';
A tu kolejny kwiatek. Zupełnie ignorujesz fakt, że tab ma ograniczoną wielkość. Jesli w buff będziesz miał "Ala<dużo spacji, więcej niż 16>", to wyjedziesz z tymi przypisaniami poza tablicę tab i - kolejna niespodzianka - będziesz nadpisywał nie to co trzeba, albo dostaniesz SEGFAULT.
Jak dla mnie to ten kod jest generatorem SEGFAULTów. Napisałeś, że dopiero się uczysz, zatem kilka rzeczy, o których powinieneś wiedzieć:
- Z arytmetyką na wskaźnikach trzeba BARDZO uważać i ostrożnie projektować algorytmy. Kompilator nawet się nie zająknie jeśli nie będziesz się pilnował, a o błędach dowiesz się dopiero po uruchomieniu programu, często tylko po zaistnieniu specyficznych warunków (np. w przypadku Twojego kodu jeśli będziesz przeszukiwał cstringa kończącego się na "Ala", lub zawierającego za tym słowem dużą ilość spacji).
- Niezależnie od tego czy czytasz, czy piszesz do tablicy, pilnuj żebyś nie wyjechał poza jej wielkość. To podstawa! Pamiętaj, że wskaźnik nie przenosi informacji o rozmiarze obszaru pamięci, na który wskazuje, a funkcja strlen() "wie" jaki rozmiar ma cstring tylko dlatego, że cstring kończy się bajtem zerowym. Jak się nie kończy, to masz problem.
- Nigdy nie ufaj danym z zewnątrz, a w szczególności nie zakładaj, że przekazany cstring nie będzie dłuższy niż X. To standardowy błąd początkujących... "przecież nikt nie wpisze imienia dłuższego niż 64 znaki"
- Czytaj uważnie dokumentację funkcji, które używasz. Zwracaj szczególną uwagę na wartości przez nie zwracane i odpowiednio je obsługuj. Jeśli funkcja zwraca wskaźnik, musisz założyć, że może zwrócić NULL i być na to przygotowanym.