Łańcuchy znaków – string w C#

Poznasz najważniejsze metody pracy z tekstem: wyszukiwanie, wycinanie, łączenie, dzielenie i formatowanie stringów.

string Substring Split Join Replace
01

Czym jest string?

String (łańcuch znaków) to ciąg pojedynczych znaków reprezentujący tekst. W C# jest to typ referencyjny, ale zachowuje się często jak typ wartościowy.

cs/WprowadzenieString.cs C#
string tekst = "Witaj świecie!";
Console.WriteLine(tekst);

// string to alias dla System.String
String tekst2 = "To samo co string";

Kluczowe informacje

CechaOpis
Aliasstring = System.String
NiemutowalnyNie można zmieniać zawartości – każda „zmiana” tworzy nowy obiekt
IndeksowanieMożna traktować jak tablicę znaków (dostęp przez [indeks])
CudzysłówTekst w podwójnych cudzysłowach: "tekst"
Niemutowalność – co to znaczy?

Kiedy „zmieniasz” string, np. tekst = tekst.ToUpper(), tak naprawdę tworzysz nowy obiekt w pamięci. Oryginalny string pozostaje niezmieniony (lub jest usuwany przez garbage collector).

tekst = „abc”
pamięć: „abc”
tekst.ToUpper()
tworzy nowy
tekst = „ABC”
pamięć: „ABC”
02

Dostęp do pojedynczych znaków

String można traktować jak tablicę znaków char. Dostęp przez indeks w nawiasach kwadratowych.

cs/DostepDoZnakow.cs C#
string nazwa = "C# jest super";

// Dostęp do znaków przez indeks (od 0!)
char pierwszyZnak = nazwa[0];    // 'C'
char trzeci = nazwa[2];           // ' ' (spacja)

// Ostatni znak
char ostatni = nazwa[nazwa.Length - 1];  // 'r'

// Właściwość Length – liczba znaków
Console.WriteLine($"Długość: {nazwa.Length}");  // 13

// Iteracja przez wszystkie znaki
foreach (char c in nazwa)
{
    Console.Write($"[{c}]");
}
// Wynik: [C][#][ ][j][e][s][t][ ][s][u][p][e][r]
Nie można zmieniać znaków!

nazwa[0] = 'D';BŁĄD KOMPILACJI!
String jest niemutowalny – nie można zmieniać pojedynczych znaków przez przypisanie.

SkładniaOpisPrzykład
tekst[i]Znak na pozycji i"ABC"[0]'A'
tekst.LengthLiczba znaków"ABC".Length3
tekst[tekst.Length-1]Ostatni znak"ABC"[2]'C'
03

Sprawdzanie i czyszczenie tekstu

Pusty string i null

cs/PustyString.cs C#
// Różne sposoby utworzenia pustego stringa
string pusty1 = "";
string pusty2 = string.Empty;  // Preferowane!

// Sprawdzanie czy string jest pusty lub null
string tekst = "";

if (string.IsNullOrEmpty(tekst))
{
    Console.WriteLine("String jest pusty lub null");
}

// Sprawdza też białe znaki (spacje, taby)
string spacje = "   ";
if (string.IsNullOrWhiteSpace(spacje))
{
    Console.WriteLine("String jest pusty, null lub same spacje");
}

Usuwanie białych znaków (Trim)

cs/Trim.cs C#
string zSpacjami = "   Witaj świecie!   ";

Console.WriteLine($"Oryginalny: '[{zSpacjami}]'");
Console.WriteLine($"Trim():      '[{zSpacjami.Trim()}]'");
Console.WriteLine($"TrimStart(): '[{zSpacjami.TrimStart()}]'");
Console.WriteLine($"TrimEnd():   '[{zSpacjami.TrimEnd()}]'");

// Wynik:
// Oryginalny: '[   Witaj świecie!   ]'
// Trim():      '[Witaj świecie!]'
// TrimStart(): '[Witaj świecie!   ]'
// TrimEnd():   '[   Witaj świecie!]'

Zmiana wielkości liter

cs/WielkoscLiter.cs C#
string tekst = "Programowanie w C#";

Console.WriteLine(tekst.ToUpper());  // PROGRAMOWANIE W C#
Console.WriteLine(tekst.ToLower());  // programowanie w c#

// Przydatne przy porównywaniu (ignorowanie wielkości liter)
string input = "ANNA";
if (input.ToLower() == "anna")
{
    Console.WriteLine("Imiona są takie same!");
}
MetodaOpis
string.IsNullOrEmpty(s)Sprawdza czy null lub ""
string.IsNullOrWhiteSpace(s)Sprawdza też białe znaki
s.Trim()Usuwa spacje z początku i końca
s.TrimStart()Usuwa spacje tylko z początku
s.TrimEnd()Usuwa spacje tylko z końca
s.ToUpper()Zamienia na WIELKIE litery
s.ToLower()Zamienia na małe litery
04

Wyszukiwanie w tekście

cs/Wyszukiwanie.cs C#
string email = "student@technikum.edu.pl";

// Sprawdzanie zawartości (zwraca true/false)
Console.WriteLine(email.Contains("@"));           // true
Console.WriteLine(email.StartsWith("student"));  // true
Console.WriteLine(email.EndsWith(".pl"));        // true

// Znajdowanie pozycji (zwraca indeks lub -1)
int pozycja = email.IndexOf('@');
Console.WriteLine($"Pozycja @: {pozycja}");  // 7

// Sprawdzanie czy NIE znaleziono
if (email.IndexOf('$') == -1)
{
    Console.WriteLine("Nie zawiera znaku $");
}

// LastIndexOf – ostatnie wystąpienie
int ostatniaPozycja = email.LastIndexOf('.');
Console.WriteLine($"Ostatnia kropka: {ostatniaPozycja}");  // 21
MetodaZwracaOpis
Contains("tekst")boolCzy zawiera podany fragment?
StartsWith("tekst")boolCzy zaczyna się od…?
EndsWith("tekst")boolCzy kończy się na…?
IndexOf("tekst")intPozycja pierwszego wystąpienia (-1 jeśli brak)
LastIndexOf("tekst")intPozycja ostatniego wystąpienia
IndexOf zwraca -1

Jeśli szukany tekst nie został znaleziony, IndexOf() zwraca -1. Zawsze sprawdzaj ten przypadek!

05

Wycinanie fragmentów (Substring)

Metoda Substring() pozwala wyciąć fragment tekstu.

cs/Substring.cs C#
string kod = "PL-12345-ABC";
Console.WriteLine($"Oryginalny: {kod}");

// Substring(startIndex, length) – wycina "length" znaków od pozycji "startIndex"
string kraj = kod.Substring(0, 2);      // "PL"
string numer = kod.Substring(3, 5);     // "12345"

// Substring(startIndex) – od pozycji do końca
string litery = kod.Substring(9);       // "ABC"

Console.WriteLine($"Kraj: {kraj}");
Console.WriteLine($"Numer: {numer}");
Console.WriteLine($"Litery: {litery}");
Jak działa Substring?

"PL-12345-ABC"
Indeksy: 0 1 2 3 4 5 6 7 8 9 10 11

Substring(0, 2) → od pozycji 0, weź 2 znaki → "PL"
Substring(3, 5) → od pozycji 3, weź 5 znaków → "12345"
Substring(9) → od pozycji 9 do końca → "ABC"

SkładniaOpis
Substring(startIndex)Od pozycji startIndex do końca
Substring(startIndex, length)Od pozycji startIndex, długość length
Uwaga na wyjątek!

Jeśli startIndex lub length wykracza poza długość stringa, program rzuci ArgumentOutOfRangeException!

06

Łączenie stringów

Operator + (proste łączenie)

cs/Laczenie.cs C#
string imie = "Anna";
string nazwisko = "Kowalska";

// Operator +
string pelne = imie + " " + nazwisko;
Console.WriteLine(pelne);  // "Anna Kowalska"

// Interpolacja (preferowana!)
string pelne2 = $"{imie} {nazwisko}";
Console.WriteLine(pelne2);  // "Anna Kowalska"

string.Join() – łączenie z separatorem

cs/Join.cs C#
// Łączenie tablicy w jeden string
string[] przedmioty = { "Matematyka", "Informatyka", "Fizyka" };

string lista = string.Join(", ", przedmioty);
Console.WriteLine(lista);
// "Matematyka, Informatyka, Fizyka"

// Działa też z liczbami!
int[] oceny = { 5, 4, 4, 3, 5 };
string listaOcen = string.Join(" - ", oceny);
Console.WriteLine(listaOcen);
// "5 - 4 - 4 - 3 - 5"

StringBuilder – dla wielu łączeń

cs/StringBuilder.cs C#
using System.Text;

// StringBuilder jest wydajniejszy dla wielu łączeń
StringBuilder sb = new StringBuilder();

sb.Append("Imię: ");
sb.Append("Anna");
sb.AppendLine();  // Dodaje nową linię
sb.Append("Wiek: 20");

string wynik = sb.ToString();
Console.WriteLine(wynik);
Kiedy używać StringBuilder?

Gdy łączysz stringi w pętli (np. 100+ razy). Każde + tworzy nowy obiekt w pamięci, a StringBuilder modyfikuje jeden obiekt.

07

Dzielenie tekstu (Split)

Metoda Split() dzieli string na tablicę stringów według separatora.

cs/Split.cs C#
// Dzielenie po przecinku
string dane = "Anna,Kowalska,20,Warszawa";
string[] elementy = dane.Split(',');

Console.WriteLine($"Imię: {elementy[0]}");      // Anna
Console.WriteLine($"Nazwisko: {elementy[1]}");  // Kowalska
Console.WriteLine($"Wiek: {elementy[2]}");      // 20
Console.WriteLine($"Miasto: {elementy[3]}");    // Warszawa

// Dzielenie po spacjach
string zdanie = "To jest przykładowe zdanie";
string[] slowa = zdanie.Split(' ');
Console.WriteLine($"Liczba słów: {slowa.Length}");  // 4

Split z wieloma separatorami

cs/SplitWiele.cs C#
string tekst = "jeden;dwa,trzy cztery";

// Dzielenie po wielu separatorach
char[] separatory = { ';', ',', ' ' };
string[] czesci = tekst.Split(separatory);

foreach (string c in czesci)
{
    Console.WriteLine(c);
}
// jeden
// dwa
// trzy
// cztery

// Usuwanie pustych elementów
string tekst2 = "a,,b,  ,c";
string[] bez = tekst2.Split(',', StringSplitOptions.RemoveEmptyEntries);
// Wynik: ["a", "b", "  ", "c"] (puste usunięte, ale spacje nie)
„A,B,C”
string
Split(’,’)
[„A”,”B”,”C”]
string[]
Join(„,”)
„A,B,C”
string
08

Zamiana tekstu (Replace)

cs/Replace.cs C#
string tekst = "C++ jest trudny, ale C++ jest potężny";

// Zamiana wszystkich wystąpień
string nowy = tekst.Replace("C++", "C#");
Console.WriteLine(nowy);
// "C# jest trudny, ale C# jest potężny"

// Usuwanie znaków (zamiana na pusty string)
string zSpacjami = "t e k s t";
string bezSpacji = zSpacjami.Replace(" ", "");
Console.WriteLine(bezSpacji);  // "tekst"

// Zamiana pojedynczego znaku
string path = "C:\\Users\\Jan\\Dokumenty";
string unix = path.Replace('\\', '/');
Console.WriteLine(unix);  // "C:/Users/Jan/Dokumenty"
Replace zamienia WSZYSTKIE wystąpienia

Metoda Replace() zamienia wszystkie wystąpienia podanego tekstu, nie tylko pierwsze. Oryginalny string pozostaje niezmieniony – zwracany jest nowy string.

09

Formatowanie stringów

Interpolacja (preferowana metoda)

cs/Interpolacja.cs C#
string imie = "Anna";
int wiek = 20;
double srednia = 4.756;
DateTime teraz = DateTime.Now;

// Podstawowa interpolacja
string info = $"Cześć {imie}! Masz {wiek} lat.";
Console.WriteLine(info);

// Formatowanie liczb
Console.WriteLine($"Średnia: {srednia:F2}");   // 4,76
Console.WriteLine($"Procent: {srednia:P0}");  // 476%
Console.WriteLine($"Waluta: {srednia:C}");    // 4,76 zł

// Formatowanie dat
Console.WriteLine($"Data: {teraz:dd.MM.yyyy}");      // 24.09.2025
Console.WriteLine($"Czas: {teraz:HH:mm:ss}");        // 14:30:25
Console.WriteLine($"Pełna: {teraz:dddd, d MMMM}");  // środa, 24 września

Przydatne formaty

FormatOpisPrzykład
:F22 miejsca po przecinku3.141593.14
:N0Bez miejsc, z separatorami12345671 234 567
:CWaluta99.999,90 zł
:P0Procent0.1515%
:dd.MM.yyyyData24.09.2025
:HH:mmCzas 24h14:30
10

Częste błędy i pułapki

❌ Błąd 1: Próba zmiany znaku

❌ Źle

tekst[0] = 'h';
Błąd kompilacji! String niemutowalny.

✅ Dobrze

tekst = 'h' + tekst.Substring(1);
Tworzymy nowy string.

❌ Błąd 2: Porównywanie bez wielkości liter

❌ Niebezpieczne

if (input == "Anna")
„ANNA” ≠ „Anna”!

✅ Bezpieczne

if (input.ToLower() == "anna")
Lub: string.Equals(input, "Anna", StringComparison.OrdinalIgnoreCase)

❌ Błąd 3: Łączenie w pętli

❌ Nieefektywne

for (...) wynik += i;
Tworzy setki obiektów!

✅ Efektywne

StringBuilder sb;
for (...) sb.Append(i);

❌ Błąd 4: Brak sprawdzenia null

cs/NullCheck.cs C#
string tekst = null;

// ❌ Rzuci NullReferenceException!
// int dlugosc = tekst.Length;

// ✅ Bezpieczne sprawdzenie
if (!string.IsNullOrEmpty(tekst))
{
    int dlugosc = tekst.Length;
}
11

Podsumowanie

Najważniejsze metody string

KategoriaMetody
SprawdzanieContains(), StartsWith(), EndsWith(), IsNullOrEmpty()
CzyszczenieTrim(), TrimStart(), TrimEnd()
Wielkość literToUpper(), ToLower()
WyszukiwanieIndexOf(), LastIndexOf()
WycinanieSubstring()
ZamianaReplace()
Dzielenie/łączenieSplit(), string.Join()
Kluczowe zasady

1. String jest niemutowalny – każda „zmiana” tworzy nowy obiekt
2. Używaj interpolacji $"" do formatowania
3. StringBuilder dla wielu operacji łączenia w pętli
4. Zawsze sprawdzaj wielkość liter przy porównaniach
5. Używaj IsNullOrEmpty() przed operacjami na stringach

Zadania

Zadania praktyczne

📝 Zadanie 1: Walidator hasła

Napisz funkcję CzyHasloPoprawne(string haslo), która sprawdza:

  • Minimum 8 znaków
  • Zawiera wielką literę
  • Zawiera małą literę
  • Zawiera cyfrę

Zwraca true jeśli wszystkie warunki spełnione.

💡 Podpowiedź: Iteruj przez foreach (char c in haslo)

📝 Zadanie 2: Generator inicjałów

Napisz funkcję DajInicjaly(string imieNazwisko), która:

  • Przyjmuje „Jan Kowalski” i zwraca „J.K.”
  • Obsługuje też więcej słów: „Jan Maria Kowalski” → „J.M.K.”

💡 Podpowiedź: Użyj Split(' ') i slowo[0]

📝 Zadanie 3: Walidator emaila

Napisz funkcję CzyEmailPoprawny(string email), która sprawdza:

  • Zawiera dokładnie jeden znak @
  • Przed @ jest minimum 1 znak
  • Po @ jest minimum 3 znaki
  • Kończy się na .pl, .com lub .edu

⭐ Zadanie 4: Cenzura tekstu

Napisz program, który:

  • Ma listę „zabronionych” słów
  • Zamienia je na gwiazdki (tyle gwiazdek ile liter)
  • Np. „brzydkie” (8 liter) → „********”

💡 Podpowiedź: new string('*', slowo.Length)

⭐⭐ Zadanie 5: Parser CSV

Napisz program, który:

  • Wczytuje dane CSV: „Imie,Nazwisko,Wiek”
  • Konwertuje na format: „Imię Nazwisko (wiek lat)”
  • Oblicza średni wiek wszystkich osób
  • Znajduje najstarszą i najmłodszą osobę

Przykład: „Anna,Kowalska,20” → „Anna Kowalska (20 lat)”