KWALIFIKACJA INF2 + INF3 - CZERWIEC 2006

PYTANIE NR 25.
Funkcja test zlicza znaki w tablicy s do napotkania terminatora null (wartość 0):

int test(char s[])
{ int i; for (i = 0; s[i] != '\0'; i++); return i;
}


Co wyznacza ta funkcja?
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Pętla zwiększa i od 0, dopóki kolejne elementy tablicy s nie są terminatorem null ('\0', wartość 0). Zmienna i po wyjściu z pętli jest długością napisu w znakach, czyli liczbą znaków przed terminatorem. Dlatego funkcja zwraca liczbę znaków zmiennej s.
To odpowiednik działania strlen().

Pełne wyjaśnienie:

W języku C napis jest przechowywany jako tablica znaków zakończona terminatorem null, czyli bajtem o wartości 0 zapisywanym jako '\0'. Oznacza to, że "koniec napisu" nie wynika z ujemnej/dodatniej wartości znaku, tylko z napotkania właśnie tego terminatora.

W podanej funkcji zmienna i startuje od 0, a pętla for wykonuje kolejne kroki tak długo, jak długo s[i] != '\0'. Gdy pojawi się terminator, pętla się kończy, a zwracana wartość i jest liczbą elementów tablicy przed '\0', czyli długością napisu (liczbą znaków).

Odpowiedź "ilość znaków 0 w zmiennej s." jest błędna, bo kod nie zlicza wszystkich zer w tablicy, tylko zatrzymuje się na pierwszym '\0'. Odpowiedź "częstość wystąpień znaku 'i'." jest błędna, bo i jest tylko licznikiem indeksu, a funkcja nie porównuje znaków z 'i'. Odpowiedź "ilość liczb większych od zero." nie pasuje, bo przetwarzane są znaki w tablicy, a kryterium pętli dotyczy wyłącznie terminatora końca napisu.

Wskazówka egzaminacyjna: jeśli widzisz zliczanie w tablicy znaków aż do '\0', to niemal zawsze chodzi o długość napisu (logika jak w strlen()).

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Terminator null to znak '\0' (bajt o wartości 0), który oznacza koniec napisu w C. Napis nie ma zapisanego "rozmiaru", więc funkcje tekstowe czytają znaki po kolei, aż trafią na '\0'. Dlatego poprawne zliczanie znaków polega na sprawdzaniu właśnie terminatora.
Gdy po pętli for stoi średnik, jej ciało jest puste i cała praca dzieje się w nagłówku: inicjalizacja, warunek i inkrementacja. W tym zadaniu pętla tylko zwiększa indeks i tak długo, aż warunek przestanie być spełniony, a potem zwracane jest i.
Bo długość napisu w C to liczba znaków przed pierwszym '\0'. Warunek s[i] != '\0' jest jednoznaczny: nie zależy od tego, czy znak ma wartość dodatnią czy ujemną, ani od kodowania. Pętla kończy się dokładnie tam, gdzie kończy się napis.
W praktyce nie jest to bezpieczne. s[i] > 0 to porównanie liczbowe wartości bajtu, a nie test końca napisu. Jeśli char jest typu signed, znaki o kodach powyżej 127 mogą stać się ujemne i pętla zakończy się zbyt wcześnie, mimo że nie było '\0'.
Dla pustego napisu pierwszy element tablicy to od razu '\0'. Warunek pętli jest wtedy fałszywy już na starcie, więc i pozostaje równe 0 i taka wartość zostanie zwrócona. To zgodne z definicją długości pustego napisu.
Najczęstsze pomyłki to: używanie warunku zależnego od wartości znaku (np. >0), zapominanie o '\0', mylenie rozmiaru tablicy z długością napisu oraz brak miejsca na terminator przy tworzeniu bufora. Na egzaminie zawsze szukaj w kodzie sprawdzania '\0'.
Wskazówką jest schemat: indeks startuje od 0, pętla idzie po kolejnych znakach tablicy, a zatrzymanie następuje na '\0', po czym zwracany jest licznik. To dokładnie idea działania strlen(): zliczyć znaki przed terminatorem, bez wliczania '\0'.
Standard języka C nie narzuca, czy char ma być signed czy unsigned — to zależy od kompilatora/architektury i opcji kompilacji. Ma to znaczenie przy porównaniach liczbowych (np. >0), bo ten sam bajt może być interpretowany jako liczba ujemna lub dodatnia.
Standardowo używa się funkcji bibliotecznej strlen() z nagłówka string.h. Ona także iteruje po znakach aż do '\0' i zwraca liczbę znaków przed terminatorem. Na egzaminie warto znać zasadę działania, bo pytania często pokazują "ręczną" implementację.
Ćwicz analizę krótkich funkcji: najpierw ustal, co jest warunkiem zakończenia (np. '\0'), potem co jest licznikiem, a na końcu co jest zwracane. Rób też testy na przykładach: pusty napis, napis 1-znakowy, napis z różnymi znakami. To ułatwia szybkie wnioskowanie.
info

Około 42% zdających odpowiada poprawnie na to pytanie. trudne

Eksperci podkreślają: "Pętla zwiększa i od 0, dopóki kolejne elementy tablicy s nie są terminatorem null ('\0', wartość 0)."

Źródła:

  • cppreference.com: "strlen" (C library) — https://en.cppreference.com/w/c/string/byte/strlen (dostęp: 2026-03-14)
  • cppreference.com: "char" i własności typu znakowego — https://en.cppreference.com/w/c/language/type (dostęp: 2026-03-14)
  • GCC Online Documentation: "Code Generation Options" (m.in. -fsigned-char / -funsigned-char) — https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html (dostęp: 2026-03-14)

Materiały:

  • Dokumentacja funkcji strlen() oraz opis terminatora '\0'
  • Materiały o typach całkowitych i znakowych w C (signed/unsigned char)
  • Ćwiczenia z ręcznym śledzeniem działania pętli for po tablicy znaków

Aktualizacja pytania: 03.04.2026



Aktualizacja pytania: 03.04.2026
📡 Brak połączenia internetowego