wleci
O mnieProjektyBlogKontakt
Kontakt
Wróć do bloga
NapisyStyl CPodstawy

Etap 6: Obsługa napisów w stylu C (char[])

Przewodnik po niskopoziomowym przetwarzaniu napisów jako tablic znaków zakończonych zerem, zgodnie z ograniczeniami kolokwium.

11 lutego 20263 min czytania
Udostępnij:

Napisy w stylu C: Tablice typu char

W przeciwieństwie do klasy std::string, napisy w stylu C to po prostu tablice elementów typu char. Kluczowym elementem, który odróżnia zwykłą tablicę znaków od „napisu”, jest znak pusty (null terminator), zapisywany jako \0. To on informuje funkcje takie jak cout czy printf, gdzie kończy się tekst.


1. Deklaracja i Inicjalizacja

Pamiętaj, że tablica musi być zawsze o 1 element większa niż liczba znaków, które chcesz przechowywać, aby zmieścić \0.

cpp
char napis[6] = "Cześć"; // 5 znaków + \0 char bezRozmiaru[] = "Automatyczny rozmiar"; // Kompilator sam policzy miejsce

2. Wczytywanie i Wypisywanie

Zgodnie z zasadami Twojego kolokwium, możesz używać zarówno iostream, jak i cstdio.

Używając iostream:

  • std::cin >> napis; – Wczytuje tekst do pierwszej spacji. Ryzykowne, bo może przekroczyć rozmiar tablicy.
  • std::cin.getline(napis, rozmiar); – Najbezpieczniejsza metoda. Wczytuje całą linię (ze spacjami) i dba o to, by nie przepełnić bufora.

Używając cstdio:

  • scanf("%s", napis); – Podobnie jak cin, przerywa na spacji.
  • printf("%s\n", napis); – Szybkie wypisywanie tekstu.

3. Ręczne operacje na napisach (Bez <cstring>)

Ponieważ Twoja lista dozwolonych bibliotek nie zawiera <cstring> (gdzie są strlen czy strcpy), musisz umieć wykonać te operacje ręcznie za pomocą pętli. To najczęstszy test umiejętności na kolokwiach.

Obliczanie długości (własne strlen)

cpp
int dlugosc(char tab[]) { int i = 0; while (tab[i] != '\0') { i++; } return i; }

Kopiowanie napisu (własne strcpy)

cpp
void kopiuj(char cel[], char zrodlo[]) { int i = 0; while (zrodlo[i] != '\0') { cel[i] = zrodlo[i]; i++; } cel[i] = '\0'; // Bardzo ważne: dodanie zera na końcu! }

4. Pułapki i błędy krytyczne

  1. Brak znaku \0: Jeśli ręcznie wypełniasz tablicę i zapomnisz o zerze na końcu, cout będzie wypisywał znaki tak długo, aż przypadkiem trafi na zero w pamięci, co objawia się „krzakami” na ekranie lub błędem programu.
  2. Przepełnienie bufora: Próba wczytania 20 znaków do tablicy char[10]. Zawsze używaj cin.getline z podaniem rozmiaru.
  3. Porównywanie napisów: if (napis1 == napis2) w przypadku tablic char[] nie zadziała poprawnie (porównasz adresy w pamięci, a nie treść). Musisz napisać własną funkcję porównującą znak po znaku.

Przykład: Porównywanie napisów

cpp
bool czyTakieSame(char t1[], char t2[]) { int i = 0; while (t1[i] != '\0' && t2[i] != '\0') { if (t1[i] != t2[i]) return false; i++; } return t1[i] == t2[i]; // Sprawdzenie czy oba kończą się w tym samym miejscu }

Może Cię zainteresować

WskaźnikiPamięć

Etap 11: Arytmetyka wskaźników w C++

Zrozumienie, jak C++ operuje na adresach pamięci. Dowiedz się, dlaczego ptr++ to coś więcej niż dodanie jedynki.

3 min czytania
WskaźnikiZarządzanie pamięcią

Etap 10: Wskaźniki, operator adresu i dereferencji

Zrozumienie fundamentów adresowania pamięci w C++: jak działają wskaźniki i operatory niskopoziomowe.

3 min czytania
FunkcjePodstawy

Etap 4: Funkcje i przekazywanie argumentów w C++

Dogłębna analiza definiowania funkcji, prototypów oraz różnic między przekazywaniem przez wartość i referencję.

2 min czytania
Wróć do bloga
wleci.pl

Full-stack Developer

Tworzę nowoczesne aplikacje webowe z pasją do czystego kodu i dobrego designu.

[email protected]
Polska

Nawigacja

  • Start
  • O mnie
  • Projekty
  • Blog
  • Kontakt

Usługi

  • Aplikacje webowe
  • Strony internetowe
  • API & Backend
  • Konsultacje

Technologie

  • React / Next.js
  • TypeScript
  • Node.js
  • PostgreSQL

Social

© 2026 wleci.pl. Wszelkie prawa zastrzeżone.

Polityka prywatności•Regulamin

Zrobione z w Polsce