Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Algorytmy i podstawy informatyki

char str1[5] = "Ala ma kota"; printf("%s", str1); Wskaż, na czym polega błąd w kodzie zapisanym w języku C++.

char str1[5] = "Ala ma kota";
printf("%s", str1);
Wskaż, na czym polega błąd w kodzie zapisanym w języku C++.
A. W funkcji printf nie można stosować formatowania %s.
B. Do funkcji printf przekazano zbyt mało argumentów.
C. Tablica str1 jest za mała, aby pomieścić napis.
D. Napis powinien być ujęty w apostrofy.
Istota błędu jest w rozmiarze tablicy znaków. W C i C++ napis zapisany w cudzysłowie, na przykład "Ala ma kota", jest przechowywany jako ciąg znaków zakończony znakiem zerowym '\0'. Ten końcowy znak jest bardzo ważny, bo funkcje takie jak printf z formatem %s czytają tekst właśnie do momentu napotkania '\0'. Sam napis "Ala ma kota" ma 11 widocznych znaków, a razem ze znakiem końca napisu potrzeba 12 elementów typu char. Tablica char str1[5] ma tylko 5 miejsc, więc nie da się w niej poprawnie zmieścić całego tekstu. W praktyce kompilator C++ zwykle zgłosi błąd w stylu: initializer-string for char array is too long. Poprawniej byłoby napisać char str1[12] = "Ala ma kota"; albo jeszcze lepiej char str1[] = "Ala ma kota";, wtedy kompilator sam policzy potrzebny rozmiar. W nowoczesnym C++ moim zdaniem najczytelniej użyć std::string, bo zmniejsza to ryzyko pomyłek z rozmiarem bufora i znakiem kończącym napis. To jest dobra praktyka, szczególnie gdy tekst może się zmieniać lub pochodzić od użytkownika.
W tym przykładzie łatwo pomylić kilka rzeczy, bo kod wygląda krótko i dość niewinnie. Problem nie polega na liczbie argumentów przekazanych do printf. Format "%s" oznacza, że funkcja oczekuje jednego argumentu będącego wskaźnikiem na napis w stylu C, czyli najczęściej tablicy char zakończonej znakiem '\0'. Wywołanie printf("%s", str1) ma więc poprawny układ argumentów: najpierw format, potem dane do wypisania. Oczywiście samo str1 musi wskazywać na poprawny, zakończony napis, i tu właśnie pojawia się realny problem. Nie chodzi też o apostrofy. W C++ cudzysłowy służą do zapisu literałów tekstowych, a apostrofy do pojedynczych znaków, na przykład 'A'. Próba zapisania dłuższego tekstu w apostrofach nie tworzy normalnego napisu, tylko prowadzi do zupełnie innej konstrukcji albo błędu, zależnie od kompilatora. Formatowanie %s w printf jest jak najbardziej dozwolone, bo pochodzi ze standardowej biblioteki C i w C++ nadal można go używać po dołączeniu odpowiedniego nagłówka, choć w czystym stylu C++ częściej spotyka się std::cout albo std::string. Typowy błąd myślowy polega na liczeniu tylko kilku pierwszych znaków lub zapomnieniu o znaku '\0'. Tablica pięcioelementowa mogłaby pomieścić co najwyżej cztery widoczne znaki napisu plus terminator, na przykład "Ala" z zapasem, ale nie całe "Ala ma kota". Dlatego poprawna diagnoza dotyczy za małego bufora, a nie składni printf czy rodzaju cudzysłowu.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.