KWALIFIKACJA INF3 - CZERWIEC 2024 (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:
W C/C++ napis (łańcuch znaków) zapisuje się w cudzysłowie, np. "Ala ma kota".
Użycie apostrofów oznacza literał znakowy (a w tym przypadku niedozwolony/niepoprawny dla napisu), więc inicjalizacja tablicy znaków jest błędna. Dlatego poprawne jest: "Napis powinien być ujęty w cudzysłów."

Pełne wyjaśnienie:

W kodzie zadeklarowano tablicę znaków: char str1[30], czyli bufor na tekst zakończony znakiem NUL (\0). Taka tablica może być poprawnie zainicjalizowana literałem łańcuchowym, czyli napisem ujętym w cudzysłów, np. "Ala ma kota". Wtedy kompilator zapisuje kolejne znaki oraz dodaje znak zakończenia.

W pokazanym fragmencie użyto jednak apostrofów: 'Ala ma kota'. W C/C++ apostrof służy do zapisu literału znakowego (pojedynczego znaku), np. 'A'. Zapis wieloznakowy w apostrofach nie jest poprawnym sposobem tworzenia napisu do tablicy char[], dlatego to właśnie jest błąd, który należy wskazać.

Dlaczego pozostałe odpowiedzi są nieprawidłowe?

  • "Napis powinien mieć dokładnie 30 znaków." – rozmiar 30 oznacza maksymalną pojemność bufora. Napis może być krótszy; ważne jest tylko, by mieścił się w tablicy (z uwzględnieniem znaku NUL).
  • "Do funkcji printf przekazano zbyt mało argumentów." – format "%s" wymaga jednego argumentu będącego wskaźnikiem na napis i ten argument został przekazany (str1), więc liczba argumentów się zgadza.
  • "W funkcji printf nie można stosować formatowania %s" – przeciwnie, %s jest standardowym specyfikatorem do wypisywania napisów zakończonych NUL.

Wskazówka egzaminacyjna: jeśli widzisz char[] i tekst, szukaj cudzysłowów; jeśli widzisz pojedynczy znak typu char, wtedy właściwy jest apostrof.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Apostrof w C++ służy do zapisu literału znakowego, czyli pojedynczego znaku typu char, np. 'A'. Taki zapis nie tworzy napisu (łańcucha). Do napisów używa się cudzysłowu, bo potrzebny jest ciąg znaków zakończony \0.
Cudzysłów w C++ oznacza literał łańcuchowy, np. "Ala ma kota". Taki literał jest ciągiem znaków zakończonym znakiem NUL (\0), dzięki czemu może być użyty do inicjalizacji tablicy char[] oraz do wypisywania przez format %s.
Bo zapis w apostrofach jest przeznaczony dla pojedynczego znaku, a nie dla napisu. Tablica char str1[30] oczekuje inicjalizacji napisem (cudzysłów) albo listą znaków. Użycie apostrofów nie tworzy poprawnego łańcucha dla wypisywania %s.
Nie. Rozmiar 30 to pojemność bufora, a nie wymagana długość napisu. Napis może być krótszy, byle mieścił się w tablicy razem ze znakiem zakończenia \0. Problemem jest delimitator napisu, a nie to, czy tekst ma 30 znaków.
Tak. Specyfikator %s w printf służy do wypisywania napisu zakończonego znakiem NUL (\0), czyli klasycznego C-stringa. Warunkiem jest przekazanie wskaźnika na pierwszy znak napisu, np. nazwy tablicy znaków.
Łańcuch formatu "%s" ma jeden specyfikator, więc wymaga jednego argumentu do wypisania. W kodzie przekazano str1, czyli nazwę tablicy (adres pierwszego elementu), więc liczba argumentów się zgadza. Błąd dotyczy inicjalizacji napisu, nie wywołania printf.
Najprościej: char str1[30] = "Ala ma kota"; a potem wypisać tekst przez printf("%s", str1);. Kluczowe jest użycie cudzysłowu dla napisu, aby powstał C-string zakończony \0.
Często tak, bo std::string jest bezpieczniejszy i wygodniejszy (zarządza rozmiarem, łatwiejsze operacje). W zadaniach egzaminacyjnych spotyka się jednak char[] i printf, więc warto umieć rozróżnić apostrof/cudzysłów i pojęcie napisu zakończonego \0.
Najczęstsze pomyłki to: użycie apostrofów dla całego napisu, traktowanie cudzysłowu jak pojedynczego znaku oraz zapominanie o \0 przy pracy z %s. W pytaniach testowych zwykle chodzi o rozpoznanie, czy dany zapis tworzy znak, czy łańcuch znaków.
Gdy przekazany "napis" nie jest poprawnie zakończony znakiem NUL (\0) albo gdy wskaźnik nie wskazuje na prawidłową tablicę znaków. Wtedy %s czyta pamięć dalej aż przypadkowo trafi na \0. To inny problem niż w tym zadaniu, ale blisko powiązany z pojęciem C-stringów.
info

Statystycznie 60% uczniów zna prawidłową odpowiedź. średnie

Eksperci podkreślają: "Dlatego poprawne jest: "Napis powinien być ujęty w cudzysłów.""

Źródła:

  • cppreference.com: C++ string literal ("...") – https://en.cppreference.com/w/cpp/language/string_literal (dostęp: 2026-02-27)
  • cppreference.com: C++ character literal ('a') – https://en.cppreference.com/w/cpp/language/character_literal (dostęp: 2026-02-27)
  • cppreference.com: std::printf i specyfikator %s – https://en.cppreference.com/w/cpp/io/c/fprintf (dostęp: 2026-02-27)

Materiały:

  • Dokumentacja literałów w C++ (sekcja o string literals i character literals)
  • Ćwiczenia: konwersje char vs const char* oraz inicjalizacja tablic
  • Materiały o bezpieczeństwie pracy na buforach znakowych (NUL, rozmiar, przepełnienia)

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego