09. Porozmawiajmy o „stringach”

09. Porozmawiajmy o „stringach”

 Daniel Celeda
Daniel Celeda
00:00
24.01.2006
18 komentarzy
174866 wyświetleń

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”.

@STRONA@

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();
    }
}

@STRONA@

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.

@STRONA@

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();
    }
}


Spodobał Ci się ten artykuł? Podziel się z innymi!

Źródło:

Polecamy również w kategorii Kurs C#, cz. I

Komentarze

  • Pepek 23:24 06.06.2006

    Jak dla mnie temat omówiony baaardzo pobieżnie. Nie ma nic o wyszukiwaniu, dzieleniu, zamianie łańcuchów znaków itp.

  • Andy 14:49 14.06.2006

    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.

  • Kuba 17:16 14.06.2006

    ...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.

  • hlehle 02:34 21.06.2006

    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ł :)

  • memo 22:47 13.08.2006

    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.

  • bartek 16:30 21.08.2006

    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.

  • Tobiasz 11:20 05.09.2006

    Ja osobiście wolę kursy na www.tibik.nazwa.pl

  • Michalos 16:16 23.11.2007

    Podoba mi sie ta funckja klamrowa cos takiego posiadaja pritfy a kurde w strumieniami to skladnia jest rozbrajająca

  • kacperos007 00:32 19.12.2007

    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.

  • Arturro 12:34 11.05.2008

    fajny tytuł artykułu ;-D pozdro;-)

  • aa 20:56 12.10.2008

    <p>NA PEWNO - tak się to pisze, kurs interesujący, czytam dalej</p>

  • markac 23:50 18.05.2009

    <p>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.</p>

  • ? 12:10 08.06.2009

    <p>A jak wyświetlić {0}, żeby nie użyło parametru?</p>

  • Kuba 15:57 24.01.2010

    A jak zrobić, zeby na 2 różne komendy były 2 różne odpowiedzi? Np. Na tak: Super! Na nie: Szkoda!

  • Kuba77 18:06 26.01.2010

    To ja Kuba. Przepraszam, nie zobaczyłem, że nick się powtarza.

  • Fox 12:04 08.04.2011

    Świetny tekst, doskonale się czyta[img]../tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif[/img]

  • odzio 10:24 05.10.2016

    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! : )

  • Kamil 23:35 19.12.2017

    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); } } }

Skomentuj

Autor