C++

Jak używać literału ciągów C++++

Jak używać literału ciągów C++++
Klawiatura komputera ma nadrukowane znaki. Kiedy naciśniesz klawisz, zobaczysz znak na ekranie. Uwaga: spacja to także znak. Literał ciągu to ciąg znaków. W tym artykule wyjaśniono, jak używać literałów napisowych w C++++. Aby zrozumieć ten artykuł, powinieneś wiedzieć o tablicach i wskaźnikach C++.

Literał znaków

Literał znakowy to znak w pojedynczych cudzysłowach. Więc,

znak ident1 = 'A'; znak ident2 = 'b'; identyfikator znaku3 = '4'; identyfikator znaku4 = '6';

są różne definicje postaci. Zwróć uwagę, że cyfra w pojedynczych cudzysłowach to znak, a nie liczba całkowita.

Sekwencja ucieczki, taka jak \” (patrz poniżej) w pojedynczych cudzysłowach, to znak. Więc,

znak ident1 = ''"';

jest postacią.

Pojedynczy symbol w cudzysłowie nie jest znakiem; jest to ciąg jednego znaku. Tak więc „A” lub „c” lub „2” nie jest znakiem, ale ciągiem jednego znaku każdy.

Zmienna znaku może zostać ponownie przypisana później w programie w następujący sposób:

identyfikator znaku = 'x';
identyfikator = 'Y';

Aby zapobiec zmianie znaku przypisanego do identyfikatora w dalszej części programu, poprzedź definicję słowem zastrzeżonym const w następujący sposób:

const char ident = 'd';

Mówi się, że zmienna ident jest tylko do odczytu.

Literał ciągu

Literał ciągu to sekwencja znaków w cudzysłowach. Więc,

char ident1[] = "Kocham cię"; char ident2[] = "Nienawidzę 3 z was"; identyfikator znaku3[]
= "jesteśmy światem"; char ident4[] = "Witaj świecie!";

są różne definicje literałów łańcuchowych. Zwróć uwagę na użycie podwójnych cudzysłowów. Nie ma nic lepszego niż zwykła zmienna dla łańcucha. Literał łańcuchowy to tablica znaków, w której zamiast rozdzielania za pomocą sekwencja jest rozdzielana za pomocą „”. Znaki nie są oddzielone przecinkami. W nawiasach kwadratowych można umieścić dowolną liczbę większą niż liczba znaków w literale łańcuchowym. Jednak lepiej zostawić puste nawiasy kwadratowe.

Pojedynczy znak w cudzysłowie nie jest znakiem; jest to ciąg jednego znaku. Tak więc „A” lub „c” lub „2” nie jest znakiem, ale ciągiem jednego znaku każdy.

Zmienna łańcuchowa nie pozwala na ponowne przypisanie pełnego literału, później w programie - patrz niżej. Poszczególne postacie można jednak przypisać ponownie - patrz poniżej.

Cytat pojedynczy i podwójny w znaku lub dosłownie

Aby mieć pojedynczy cytat jako znak, zrób coś takiego:,

identyfikator znaku = '\';

Aby mieć podwójny cudzysłów jako znak w literale ciągu, zrób coś takiego:,

identyfikator znaku[] = "ab"cd";

Ukośnik odwrotny jest używany w sekwencji specjalnej, aby uniknąć konfliktu z ogranicznikami. Aby mieć podwójny cudzysłów jako znak, nie ma potrzeby stosowania odwrotnego ukośnika: „”” jest w porządku. Aby mieć pojedynczy cudzysłów w literale ciągu, nie ma potrzeby stosowania odwrotnego ukośnika: ”ab'cd” jest w porządku.

Ponieważ odwrotny ukośnik jest używany do zmiany znaczenia znaku, musi zostać zmieniony z innym odwrotnym ukośnikiem, gdy jest używany jako znak lub w literale ciągu.

Sekwencja ewakuacyjna

Sekwencja ucieczki to jedna z:

\' " \? \\ \a \b \f \n \r >\t \v

Każda sekwencja ucieczki jest zwykle wpisywana jako znak w pojedynczych cudzysłowach lub jako sekwencja ucieczki w podwójnych cudzysłowach.

Operacje ze znakami

Powiązanie

W definicji dwa literały łańcuchowe można połączyć ze spacją w następujący sposób:

identyfikator znaku[] = "abc" "def";
Cout << ident << "\n";

Dane wyjściowe to: abcdef . Tę definicję można rozszerzyć do więcej niż dwóch literałów. Uwaga: stwierdzenie jest definicją, a nie tylko zadaniem. Definicja może nawet przejść do następnego wiersza z odstępem oddzielającym wiersze w następujący sposób:

identyfikator znaku[] = "abc" "def"
„ghi”;
Cout << ident << "\n";

Wynikiem jest abcdefghi.

Uwaga: Znaki nie mogą być łączone w ten sposób, ponieważ pojedyncze cudzysłowy dla znaku nie mogą mieć więcej niż jednego symbolu.

Operatory równości

Te same znaki w tej samej sprawie są równe. Nie są równe, jeśli nie są z tego samego przypadku. Rozważać,

wynik logiczny = 'B' == 'B';
Cout << result << "\n";

== oznacza równe, natomiast = oznacza przypisane, a nie równe. Wyjście to 1 dla prawdy. Rozważać,

wynik logiczny = 'B' == 'b';
Cout << result << "\n";

Wyjście to 0 dla fałszu. Rozważać,

wynik logiczny = 'b' == 'c';
Cout << result << "\n";

Wyjście to 0 dla fałszu. Rozważać,

wynik logiczny = 'B' != „B”;
Cout << result << "\n";

!= oznacza nierówne, a = oznacza przypisane i nierówne. Wyjście to 0 dla fałszu. Rozważać,

wynik logiczny = 'B' != 'b';
Cout << result << "\n";

Wyjście to 1 dla prawdy. Rozważać,

wynik logiczny = 'b' != „c”;
Cout << result << "\n";

Wyjście to 1 dla prawdy.

Więc == i != są operatorami równości.

Operatorzy relacyjni

W przypadku zwykłych znaków w C++, w porządku rosnącym, cyfry poprzedzają wielkie litery, które pojawiają się przed małymi literami.

Więc < will return true (1) when the left character is less than the right character. The other relational operators, <=, >, >= są podobnie wyjaśnione.

Literał tekstowy jako obiekt

Tablica jest stałym wskaźnikiem do początku sekwencji określonego typu danych. Podobnie łańcuch jest stałym wskaźnikiem do początku ciągu znaków. Porównaj następujące definicje:

int arr[] = 3, 4, 5, 6, 7;
char str[] = 'w', 'o', 'm', 'a', 'n';
char stri[] = "kobieta";

Pierwsza tablica jest tablicą int i ma pięć elementów. Druga i trzecia tablica to tablice znaków o różnych nazwach, ale tej samej liczbie elementów. Druga i trzecia tablica są takie same, ale ich nazwy. Treść tekstowa drugiej tablicy jest oddzielona nawiasami klamrowymi; znaki są oddzielone przecinkami, a każdy znak jest w pojedynczych cudzysłowach. Treść tekstowa trzeciej tablicy jest ograniczona podwójnymi cudzysłowami; znaki nie są oddzielone przecinkami, a każdy znak nie jest w pojedynczych cudzysłowach. Druga i trzecia tablica to dwa sposoby tworzenia łańcucha, przy czym trzeci sposób jest lepszym sposobem.

arr jest stałym wskaźnikiem do pierwszego elementu swojej tablicy, co oznacza, że ​​arr zawsze będzie wskazywać lokalizację z liczbą całkowitą 3, nawet jeśli wartość 3 zostanie zmieniona. Rozmiar tablicy, pięć elementów, tak naprawdę nie pozostaje stały. Jednak każdą z wartości tablicy można zmienić.

str jest stałym wskaźnikiem do pierwszego elementu swojej tablicy, co oznacza, że ​​str zawsze będzie wskazywać lokalizację ze znakiem „w”, nawet jeśli wartość „w” zostanie zmieniona. Rozmiar tablicy znaków, pięć elementów, tak naprawdę nie pozostaje stały. Jednak każdą z wartości literału można zmienić.

stri jest stałym wskaźnikiem do pierwszego elementu jego literału (tablicy), co oznacza, że ​​stri zawsze będzie wskazywać lokalizację ze znakiem w, nawet jeśli wartość w zostanie zmieniona. Rozmiar literału napisu (tablicy), pięć elementów, tak naprawdę nie pozostaje stały. Jednak każdą z wartości literału można modyfikować.

Co jest stałą w literale tablicowym lub łańcuchowym?? Adres pamięci pierwszego elementu tablicy lub literału pozostaje jako wartość nazwy (identyfikatora) tablicy lub literału i nie można go zmienić. Cóż, rozmiar tablicy lub literału tak naprawdę nie pozostaje stały. Każdą wartość w tablicy lub literale można zmienić. Poniższy kod pokazuje, jak zmieniono czwarty element każdej z tablic:

int arr[] = 3, 4, 5, 6, 7;
char str[] = 'w', 'o', 'm', 'a', 'n';
char stri[] = "kobieta";
przyp[3] = 9;
str[3] = 'e';
stri[3] = 'e';
Cout << arr[3] << '\n';
Cout << str << '\n';
Cout << stri << '\n';

Dane wyjściowe to:

9
kobiety kobiety
kobiety

Zauważ, że do elementów zdefiniowanego literału napisowego, jak w przypadku trzeciej definicji powyżej, można uzyskać dostęp za pomocą indeksu tablicy (indeks dolny). Powód drugiej linii wyjścia podano poniżej.

Definicja Indeks dolny

Zauważ, że w powyższych definicjach nie ma liczby całkowitej dla indeksu dolnego. Gdy programista nie może łatwo określić liczby elementów, należy pominąć liczbę całkowitą dla indeksu dolnego. W każdym razie liczba całkowita nie powinna być mniejsza niż liczba elementów w tablicy.

W przypadku literału napisowego liczba całkowita powinna być co najmniej o 1 wyższa od liczby znaków w łańcuchu. Dzieje się tak, ponieważ znak null (\0) jest zawsze dodawany przez kompilator na końcu tablicy, która jest ciągiem znaków rozdzielonych podwójnymi cudzysłowami. Znak null nie jest dodawany na końcu drugiej tablicy powyżej, ponieważ nie jest to oficjalny ciąg. Trzecia tablica to oficjalny ciąg. Poniższy kod pokazuje minimalne wartości indeksu dolnego.

int arr[5] = 3, 4, 5, 6, 7;
char str[5] = 'w', 'o', 'm', 'a', 'n';
char stri[6] = "kobieta";

Aby druga definicja była oficjalnym ciągiem, należy dodać znak null w następujący sposób:

int arr[5] = 3, 4, 5, 6, 7;
char str[6] = 'w', 'o', 'm', 'a', 'n', '\0';
char stri[6] = "kobieta";

Dane wyjściowe powinny teraz być,

9
kobiety
kobiety

bez drugiej „kobiety”. Zauważ, że odpowiedni indeks dla drugiej tablicy to 6, a nie 5, jak było.

Stałe wartości literalne

Aby uniemożliwić modyfikację dowolnego znaku w cudzysłowie przypisanym do identyfikatora w dalszej części programu, poprzedź definicję słowem zastrzeżonym const w następujący sposób:

const char ident[] = "Kocham cię";

Operacje z literałami ciągów

Operacje na rzecz równości

Operatorami równości są == i != . Kiedy porównywane są zmienne (identyfikatory) dwóch ciągów, porównywane są wskaźniki (adresy) literałów; to jest złe. Aby porównać ciągi, należy porównać literały, jak w poniższym kodzie:

wynik logiczny = "kobieta" == "kobieta";
Cout << result << '\n';

Wyjście to 1 dla prawdy. Porównanie odbywa się w sposób słownikowy, ale liczby pojawiają się na początku w kolejności rosnącej, przed wielkimi literami, które pojawiają się przed małymi literami. Wyjście poniższego kodu to 0, dla false.

wynik logiczny = "kobieta" != "kobieta";
Cout << result << '\n';

Operatory relacyjne z literałami łańcuchowymi

Operatory relacyjne nie działają z literałami łańcuchowymi.

Literał surowego ciągu

Literał surowego łańcucha umożliwia wyświetlanie łańcucha jako wpisanego, ignorując sekwencje specjalne i respektując znaki nowej linii. Rozważ następujący kod:

char str[] = R"(abc\\d efg hij
klmn \n " ' opq
pierwszy)";
Cout << str << '\n';

Dane wyjściowe to:

abc\\d efg hij
klmn \n " ' opq
pierwszy

W kodzie literał surowego ciągu rozpoczyna się od R, po którym następuje ” i ( . Kończy się na ) i „.

Typy literałów ciągu głównego C++

zwęglać

Typ char jest oryginalnym typem C++ i zazwyczaj przechowuje znak w 8 bitach.

char16_t

To przechowuje znak w 16 bitach.

char32_t

To przechowuje znak w 32 bitach.

wchar_t

char16_t i char32_t to szerokie znaki. wchar_t to szeroki znak, który jest zastrzeżony i zdefiniowany w implementacji.

Wniosek

Literał znakowy to pojedynczy znak w pojedynczych cudzysłowach. Sekwencja ucieczki to znak, który może być również w pojedynczych cudzysłowach. Literał ciągu to ciąg znaków w cudzysłowach. Literał ciągu to tablica znaków kończąca się na \0. Operatory równości i relacji działają z literałami znakowymi. Operatory równości działają z literałami łańcuchowymi, ale operatory relacyjne nie działają z literałami łańcuchowymi. W porównaniach można używać identyfikatorów znakowych, ale w porównaniach nie należy używać identyfikatorów znakowych. Literał surowego ciągu umożliwia wyświetlanie ciągu jako wpisanego, ignorując sekwencje specjalne i szanując nowe wiersze.

Chrys

Jak używać Xdotool do stymulacji kliknięć myszą i naciśnięć klawiszy w systemie Linux?
Xdotool to darmowe i otwarte narzędzie wiersza poleceń do symulacji kliknięć myszą i naciśnięć klawiszy. Ten artykuł zawiera krótki przewodnik dotyczą...
5 najlepszych ergonomicznych myszy komputerowych dla systemu Linux
Czy długotrwałe korzystanie z komputera powoduje ból nadgarstka lub palców?? Cierpisz na sztywne stawy i ciągle musisz uścisnąć dłonie? Czy czujesz pa...
Jak zmienić ustawienia myszy i touchpada za pomocą Xinput w systemie Linux?
Większość dystrybucji Linuksa jest domyślnie dostarczana z biblioteką „libinput” do obsługi zdarzeń wejściowych w systemie. Może przetwarzać zdarzenia...