KWALIFIKACJA INF3 - CZERWIEC 2023 (test 2)

PYTANIE NR 12.
char str1[30] = 'Ala ma kota'; printf("%s", str1); 
Wskaż na czym polega błąd w kodzie zapisanym w języku C++.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Błąd wynika z użycia apostrofów do zapisu napisu.
W C/C++ apostrofy oznaczają literał znaku (pojedynczy znak), a napis (łańcuch znaków) zapisuje się w cudzysłowie. Dlatego inicjalizacja tablicy char powinna używać "Ala ma kota", aby printf z %s mógł wypisać łańcuch.

Pełne wyjaśnienie:

W przedstawionym kodzie problem dotyczy sposobu zapisu napisu. W C/C++ apostrofy ' ' służą do zapisu pojedynczego znaku (literał znakowy), natomiast napis (literał łańcuchowy) zapisuje się w cudzysłowie " ". Tablica char str1[30] ma przechowywać łańcuch znaków zakończony znakiem \0, więc inicjalizacja powinna wyglądać jak "Ala ma kota".

Odpowiedź "Napis powinien być ujęty w cudzysłów." jest więc poprawna, bo tylko taki zapis tworzy literał łańcuchowy pasujący do inicjalizacji tablicy znaków i do wypisania przez printf ze specyfikatorem %s.

  • "Napis powinien mieć dokładnie 30 znaków." — to błędne rozumowanie: tablica może być większa niż napis. Istotne jest, aby napis zmieścił się w tablicy wraz z kończącym \0, a nie aby miał dokładnie tyle znaków co rozmiar tablicy.
  • "Do funkcji printf przekazano zbyt mało argumentów." — w przykładzie przekazano format oraz jeden argument odpowiadający %s, więc liczba argumentów (na poziomie zamiaru) jest właściwa.
  • "W funkcji printf nie można stosować formatowania %s" — to nieprawda: %s jest standardowym specyfikatorem do wypisywania łańcuchów znaków (ciągów char zakończonych \0).

Wskazówka egzaminacyjna: gdy widzisz '...' i więcej niż jeden znak w środku, od razu sprawdź, czy autor nie pomylił literału znaku z literałem łańcuchowym. To jeden z najczęstszych błędów na etapie podstaw składni.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Apostrofy ' ' oznaczają w C++ literał znaku (pojedynczy znak), np. 'A'. Napis (łańcuch znaków) zapisuje się w cudzysłowie " ", bo wtedy powstaje literał łańcuchowy zakończony znakiem \0. To ma znaczenie przy tablicach char i wypisywaniu przez printf.
Najczęściej używa się literału łańcuchowego, np. char t[30] = "Ala ma kota";. Taki zapis wstawia znaki do tablicy i dopisuje na końcu znak zakończenia \0. Kluczowe jest użycie cudzysłowów, bo tylko one tworzą napis, a nie pojedynczy znak.
Specyfikator %s wypisuje kolejne znaki od wskazanego adresu aż do napotkania znaku końca łańcucha \0. Bez \0 funkcja nie wie, gdzie kończy się tekst, co może prowadzić do wypisywania "śmieci" lub błędów. Dlatego poprawna inicjalizacja napisu jest tak ważna.
Nie. Tablica może być większa niż napis. Ważne jest tylko, aby napis zmieścił się w tablicy razem ze znakiem końca łańcucha \0. Jeśli tablica ma 30 elementów, to maksymalna długość tekstu to zwykle 29 znaków (ostatnie miejsce zajmuje \0).
Najczęstszy błąd to zapisanie napisu w apostrofach (np. 'ABC'), co w C++ nie oznacza łańcucha znaków. Drugi błąd to zapomnienie o \0 przy ręcznym tworzeniu tablicy. W zadaniach egzaminacyjnych warto od razu sprawdzić, czy literał ma poprawny delimiter i czy pasuje do oczekiwanego typu.
%s służy do wypisywania napisów, czyli wskaźnika na tablicę znaków char zakończoną znakiem \0. Używa się go, gdy argument jest łańcuchem C (C-string). Nie stosuje się go do pojedynczego znaku (tam typowo używa się %c) ani do liczb.
W C++ często preferuje się std::cout, bo jest typowo "c++-owe" i współpracuje z typami C++. Jednak na egzaminach mogą pojawiać się oba podejścia. Najważniejsze jest rozumienie, że printf z %s pracuje na łańcuchach char*, a std::cout może wypisywać też obiekty std::string.
Jeśli kod łamie składnię lub typy są oczywiście niezgodne (np. próba inicjalizacji napisem zapisanym w złym delimiterze), kompilator zwykle zgłosi błąd kompilacji. Warto czytać komunikat i wskazane miejsce w kodzie. Błędy związane z brakiem \0 częściej ujawniają się dopiero w działaniu programu.
char[] to tablica znaków, w której koniec napisu wyznacza \0. Trzeba pilnować rozmiaru i poprawnego zakończenia. std::string zarządza pamięcią sam, przechowuje długość i jest bezpieczniejszy w codziennej pracy. Na egzaminie często sprawdza się jednak podstawy obu podejść.
\0 zajmuje jeden element tablicy i jest znacznikiem końca łańcucha. Jeśli go zabraknie, funkcje operujące na napisach mogą czytać poza zakresem tablicy, bo nie mają sygnału zakończenia. Dlatego przy rozmiarze tablicy N bezpieczna maksymalna długość tekstu to zwykle N-1 znaków.
info

To pytanie poprawnie rozwiązuje 55% zdających egzamin. średnie

Eksperci podkreślają: "Błąd wynika z użycia apostrofów do zapisu napisu.W C/C++ apostrofy oznaczają literał znaku (pojedynczy znak), a napis (łańcuch znaków) zapisuje się w cudzysłowie."

Źródła:

  • cppreference.com: Character literal (C++), https://en.cppreference.com/w/cpp/language/character_literal - accessed 2026-02-27
  • cppreference.com: String literal (C++), https://en.cppreference.com/w/cpp/language/string_literal - accessed 2026-02-27
  • cppreference.com: std::printf, https://en.cppreference.com/w/cpp/io/c/printf - accessed 2026-02-27

Materiały:

  • Dokumentacja C/C++ dotycząca literałów znakowych i łańcuchowych
  • Materiały o tablicach char i zakończeniu łańcucha znakiem \0
  • Ćwiczenia z printf i specyfikatorów formatu (wejście/wyjście tekstowe)

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego