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.
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.
char napis[6] = "Cześć"; // 5 znaków + \0
char bezRozmiaru[] = "Automatyczny rozmiar"; // Kompilator sam policzy miejsce2. 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 jakcin, 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)
int dlugosc(char tab[]) {
int i = 0;
while (tab[i] != '\0') {
i++;
}
return i;
}Kopiowanie napisu (własne strcpy)
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
- Brak znaku
\0: Jeśli ręcznie wypełniasz tablicę i zapomnisz o zerze na końcu,coutbędzie wypisywał znaki tak długo, aż przypadkiem trafi na zero w pamięci, co objawia się „krzakami” na ekranie lub błędem programu. - Przepełnienie bufora: Próba wczytania 20 znaków do tablicy
char[10]. Zawsze używajcin.getlinez podaniem rozmiaru. - Porównywanie napisów:
if (napis1 == napis2)w przypadku tablicchar[]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
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ć
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.
Etap 10: Wskaźniki, operator adresu i dereferencji
Zrozumienie fundamentów adresowania pamięci w C++: jak działają wskaźniki i operatory niskopoziomowe.
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ę.