Zamknij komunikat

Nowy Office 2013
Do góry Skomentuj

09. Porozmawiajmy o „stringach”

09. Porozmawiajmy o „stringach”

Daniel Celeda
24 stycznia 2006
173 671
Odsłony
Daniel Celeda
24 stycznia 2006
173 671
Odsłony

W tym artykule postaram się przedstawić podstawowe sposoby operowania na łańcuchach znakowych, czyli na tzw. „tekstach”. Jest to bardzo ważne zagadnienie, w zasadzie podstawowe w programowaniu. Za pomocą tekstów nasze programy porozumiewają się z użytkownikiem, systemy bazodanowe prezentują dane, itd.

Typ string

Podstawowym typem danych, który przechowuje łańcuchy znakowe jest, używany przez nas już wielokrotnie w poprzednich częściach kursu, typ „string”.
Prosty przykład użycia.

class KlasaGlowna
{
    static void Main()
    {
        string napis = "Hello world!";
        System.Console.WriteLine(napis);
        System.Console.ReadLine();
    }
}

Klasa Console

Klasa „Console” jest jedną z wielu klas zdefiniowanych w przestrzeni nazw „System”. Jej zadaniem jest obsługa operacji wejścia/wyjścia, a więc między innymi wyświetlanie napisów na ekranie (operacja wyjściowa). Klasa „Console” posiada wiele metod statycznych, więc nie musimy tworzyć obiektów klasy „Console”, aby używać jej metod. Do najważniejszych metod należą „ReadLine()” oraz „WriteLine()”.

„WriteLine()” kieruje do strumienia wyjściowego, w tym przypadku na ekran (prawdopodobnie w naszym kursie nie spotkamy się z innym przypadkiem), łańcuch znakowy wraz ze znakiem nowej linii (nakazuje przejść do nowej linijki po zakończeniu wypisywania tekstu). Bliźniacza metoda „Write()” różni się tylko tym, że nie przesyła znaku nowej linii.

„ReadLine()” pozwala czytać informacje ze strumienia wejściowego (w naszym kursie będzie to klawiatura) dopóki nie pojawi się znak nowej linii. „Read()” natomiast czyta pojedyncze znaki. „ReadLine()” zwraca typ „string”, „Read()” natomiast typ „char” (zamiast „char” można używać „int” – liczby reprezentują znaki).

Napiszmy krótki programik, aby przetestować nowo zdobytą (lub jeszcze nie J ) wiedzę.

class KlasaGlowna
{
    static void Main()
    {
        string napis;
         napis = System.Console.ReadLine();
        System.Console.WriteLine(napis);
        System.Console.ReadLine();
    }
}

Program oczekuje na wprowadzany przez nas tekst, aż do momentu naciśnięcia klawisza Enter, czyli wprowadzenia znaku nowej linii. Następnie za pomocą metody „WriteLine()” wypisuje to, co wprowadziliśmy do zmiennej „napis”.

Konkatenacja

Najczęściej używaną operacją na łańcuchach jest konkatenacja, czyli łączenie. Polega to na złączeniu dwóch łańcuchów znakowych w jeden za pomocą operatora „+”, coś jak „dodawanie” tekstów.
Poniżej prezentuję program, który zawiera kilka przykładów łączenia „stringów”.

class KlasaGlowna
{
    static void Main()
    {
        string napis;
        napis = "Pierwszy napis" + "Drugi napis";
        System.Console.WriteLine(napis);
        System.Console.ReadLine();
    }
}

Wynik wygląda następująco.

Za pomocą operatora „+” możemy także łączyć zmienne typu „string”. Wynik poniższego programu będzie taki sam, jak poprzednio prezentowanego.

class KlasaGlowna
{
    static void Main()
    {
        string napis1 = "Pierwszy napis";
        string napis2 = "Drugi napis";
        string zlaczonyNapis = napis1 + napis2;
        System.Console.WriteLine(zlaczonyNapis);
        System.Console.ReadLine();
    }
}

Czas na bardziej rozbudowany, a zarazem „realny” przykład.

class KlasaGlowna
{
    static void Main()
    {
        System.Console.WriteLine("Jak masz na imię?");
        string napis = System.Console.ReadLine();
        System.Console.WriteLine("Witaj, " + napis + "!");
        System.Console.ReadLine();
    }
}

Podczas wykonania program zapyta nas o imię, a później nas powita J

Następny przykład pokazuje w jaki sposób łączyć łańcuchy znakowe z wartościami innych typów, np. całkowitoliczbowymi, czyli „int”.

class KlasaGlowna
{
    static void Main()
    {
        System.Console.WriteLine("Ile masz lat?");
        string napis = System.Console.ReadLine();
        System.Console.WriteLine("Czy aby napewno masz " + napis + " lat?");
        System.Console.ReadLine();
    }
}

W powyższym programie łączymy łańcuchy znakowe z wartościami całkowitoliczbowymi (liczby całkowite) i jako wynik otrzymujemy inny łańcuch znakowy.

Używając metody “WriteLine()” możemy łączyć łańcuchy w bardziej „wyrafinowany” sposób. Jako parametry podajemy łańcuch oraz inne parametry, które chcemy połączyć z poprzedzającym je łańcuchem.

class KlasaGlowna
{
    static void Main()
    {
        string napis1 = "pierwszy";
        string napis2 = "drugi";
        int ilosc = 3;

        System.Console.WriteLine("Ten łańcuch zawiera {0} oraz {1} parametr. Wszystkich parametrów jest {2}.",  napis1, napis2, ilosc);
        System.Console.ReadLine();
    }
}

Pomiędzy nawiasy „{}” wstawiamy numer parametru, liczony od 0, który chcemy wstawić do łańcucha. A oto wynik wykonania działania programu.

Oprócz wstawiania parametrów w odpowiednie miejsce łańcucha, możemy je odpowiednio formatować, dodając do numeru parametru znak formatowania.

Lista znaków formatujących (można także używać małych liter):

C – formatowanie waluty,
D – liczby dziesiętne, określa minimalną ilość cyfr (brakujące wypełnia zerami),
E – notacja wykładnicza,
F – formatowanie z ustaloną liczbą miejsc po przecinku,
G – ogólne formatowanie,
N – podstawowy format liczbowy,
X – format heksadecymalny.

Poniżej przedstawiam przykład, który ilustruje typy formatowania.

class KlasaGlowna
{
    static void Main()
    {
        System.Console.WriteLine("Formatowanie z C: {0:C}", 777.7777);
        System.Console.WriteLine("Formatowanie z D2: {0:D2}", 777);
        System.Console.WriteLine("Formatowanie z D9: {0:D9}", 777);
        System.Console.WriteLine("Formatowanie z E: {0:E}", 777.7777);
        System.Console.WriteLine("Formatowanie z F2: {0:F2}", 777.7777);
        System.Console.WriteLine("Formatowanie z F9: {0:F9}", 777.7777);
        System.Console.WriteLine("Formatowanie z G: {0:G}", 777.7777);
        System.Console.WriteLine("Formatowanie z N: {0:N}", 777.7777);
        System.Console.WriteLine("Formatowanie z X: {0:X}", 7779);
        System.Console.ReadLine();
    }
}

Znak nowej linii

Jak wcześniej wspomniałem, znak nowej linii nakazuje przejście do nowego wiersza. Dzięki temu nie musimy dla każdego wiersza wywoływać metody „WriteLine()”, a jedynie w łańcuch znakowy wpleść znaki nowej linii. Znak ten zapisuje się następująco „\n”.

class KlasaGlowna
{
    static void Main()
    {
        System.Console.WriteLine("To jest długi napis, \nktóry dzielimy na \nkilka linijek");
        System.Console.ReadLine();
    }
}

Jak łatwo zauważyć, znaki „\n” nie pojawią się na ekranie, tylko wypisywanie tekstu przejdzie do nowej linii.

Inne ważne znaki specjalne:
\a – „dzwonek”, wygenerowany zostanie sygnał dźwiękowy,
\b – „backspace”, skasowanie ostatniego znaku i cofnięcie o jeden znak,
\r – powrót karetki, powrót do początku linii,
\t – tabulacja (odstęp) w poziomie,
\v – tabulacja w pionie,
\’ – znak cudzysłowu (łańcuchy zawieramy w znakach cudzysłowu, a czasami jest potrzeba wypisania na ekranie tego znaku, należy wtedy użyć znaku specjalnego),
\\ - znak „backslash”, czyli „\”.

Ćwiczenie

Napisać program, który pyta użytkownika o imię, wiek, pensję. Następnie wypisuje te dane za pomocą jednego wywołania metody „WriteLine()”. Należy użyć parametrów, formatowania i znaków specjalnych.

class KlasaGlowna
{
    static void Main()
    {
        string imie;
        string wiek;
        string pensja;
        System.Console.WriteLine("Podaj swoje imię.");
        imie = System.Console.ReadLine();
        System.Console.WriteLine("Podaj swój wiek.");
        wiek = System.Console.ReadLine();
        System.Console.WriteLine("Podaj swoją pensję.");
        pensja = System.Console.ReadLine();

        System.Console.WriteLine("Nazywasz się {0}.\nMasz {1} lat.\nZarabiasz {2:C}.",
            imie, wiek, double.Parse(pensja));
        System.Console.ReadLine();
    }
}

Zobacz również

Komentarze

Jak dla mnie temat omówiony baaardzo pobieżnie. Nie ma nic o wyszukiwaniu, dzieleniu, zamianie łańcuchów znaków itp.
Pepek, 6 czerwca 2006, 23:24
CYTAT: "Następny przykład pokazuje w jaki sposób łączyć łańcuchy znakowe z wartościami innych typów, np. całkowitoliczbowymi, czyli „int”." Przykład pokazany potem wcale nie ilustruje tego co jest w cytacie ponieważ metoda ReadLine() zwaraca string a nie int.
Andy, 14 czerwca 2006, 14:49
...co autor artykułu dobitnie Ci napisał: W powyższym programie łączymy łańcuchy znakowe z wartościami całkowitoliczbowymi (liczby całkowite) i jako wynik otrzymujemy inny łańcuch znakowy.
Kuba, 14 czerwca 2006, 17:16
Do Pepek: Taki jest zakres tego artykułu (kursu). Tak jak zresztą wspomniano we wstępie: "W tym artykule postaram się przedstawić podstawowe sposoby operowania na łańcuchach ". Do Andy: Kuba już Ci odpowiedział :)
hlehle, 21 czerwca 2006, 02:34
do Kuby: nie, nie jest to łączenie stringa z intem w celu uzyskania kolejnego stringa, a znowu zwykład konkatenacja stringów. Prosty test: na pytanie "ile masz lat" odpowiedz "nie wiem". Zatem uwaga Andiego jest jak najbardziej na miejscu.
memo, 13 sierpnia 2006, 22:47
To ja dorzucę kamyczek Cytat: Używając metody “WriteLine()” możemy łączyć łańcuchy w bardziej „wyrafinowany” sposób. Jako parametry podajemy łańcuch oraz inne parametry, które chcemy połączyć z poprzedzającym je łańcuchem. koniec cytatu. Może autor odpowie jak dobrać się do tego "połączonego łańcucha" ? Poza tym bardziej pasuje mi tu zamiana a nie łączenie (wszak podłańcuchy {*} zą samieniane przez kolejne parametry. Wogóle cały kurs sprawia na mnie wrażenie pisanego na kolanie. Wydaje mi się, że autor kiedyś może miał pomysł i chęć by to zrobić ale potem mu przeszło a dokończyć trzeba.
bartek, 21 sierpnia 2006, 16:30
Ja osobiście wolę kursy na www.tibik.nazwa.pl
Tobiasz, 5 września 2006, 11:20
Podoba mi sie ta funckja klamrowa cos takiego posiadaja pritfy a kurde w strumieniami to skladnia jest rozbrajająca
Michalos, 23 listopada 2007, 16:16
Bardzo fajny kurs, takiego czegoś właśnie brakowało... wiem, że takie rzeczy są mało istotne ale jednak J w kodzie jest błąd ortograficzny :P "napewno" pisze się osobno.
kacperos007, 19 grudnia 2007, 00:32
fajny tytuł artykułu ;-D pozdro;-)
Arturro, 11 maja 2008, 12:34
NA PEWNO - tak się to pisze, kurs interesujący, czytam dalej

aa, 12 października 2008, 20:56
Myślę, że wazniejszym jest dla programisty nie to, jak połączyć dwa stringi, ale jak ten string jest przechowywany w pamięci. Gdzie jest zapisana dlugość Stringa, czy jest czymś zakończony itp.

markac, 18 maja 2009, 23:50
A jak wyświetlić {0}, żeby nie użyło parametru?

?, 8 czerwca 2009, 12:10
A jak zrobić, zeby na 2 różne komendy były 2 różne odpowiedzi? Np. Na tak: Super! Na nie: Szkoda!
Kuba, 24 stycznia 2010, 15:57
To ja Kuba. Przepraszam, nie zobaczyłem, że nick się powtarza.
Kuba77, 26 stycznia 2010, 18:06
Świetny tekst, doskonale się czyta
Fox, 8 kwietnia 2011, 12:04
na pewno, nie napewno. poza tym na poczatku jak sa opisane znaki "++" i "--" to ten drugi jest rociagniety w mojej przegladarce na 2 linijki, moze to byc mylace. poza tym swietny poradnik! : )
odzio, 5 października 2016, 10:24
Napisałem sztuczną inteligencję z tym tutorialem! using System; namespace system { class kalkulator { static void Main() { string napis; string humor; System.Console.WriteLine("Jak masz na imię?"); napis = System.Console.ReadLine(); System.Console.WriteLine("Cześć " +napis +" co u Ciebie?"); humor = System.Console.ReadLine(); System.Console.WriteLine("U mnie też " +humor); } } }
Kamil, 19 grudnia 2017, 23:35

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.