Ciągi są tworzone na dwa główne sposoby w C ++: używając stałego wskaźnika lub instancji z klasy string. String dosłowne: „Odkryłem skarb.”Można budować na następujący sposób w C ++:
char str1 [] = "Odkryłem skarb.";
const char* str2 = "odkryłem skarb.";
#włączać
String Str3 = String („Odkryłem skarb.");
String Str4 = String („Odkryłem skarb.");
Tworzenie łańcucha za pomocą tablicy lub stałego wskaźnika znaku, to ten sam sposób na tworzenie ciągu. STR3 i STR4 tutaj zostały utworzone przez instancję z dołączonej biblioteki ciągów. Należy zauważyć, że podwójne cytaty używane przez literały stringowe w programowaniu nie są takie same jak te używane przez edytora tekstu.
Pytanie brzmi: „Jak mogę porównać dwa struny w C++?„Pierwszą radą jest to, że nie porównuj ciągów stworzonych przez ciągłe wskaźniki postaci. Kiedy to robisz, porównujesz wskaźniki, a nie literał sznurka. Więc nie porównaj STR1 i STR2 powyżej. Jeśli to zrobisz, porównujesz ich wskaźniki, a nie ich zawartość.
Aby porównać ciągi w C ++, musisz porównać struny utworzone przez instancję dołączonej biblioteki ciągów. Tak więc STR3 i STR4 powyżej można porównać i będą porównywać równe.
Ten samouczek wyjaśnia, jak porównać literały smyczkowe w C ++, zaczynając od porównania znaków w C++. Porównanie postaci prowadzi do porównania strun, chociaż postacie są traktowane inaczej niż struny, w C++.
Treść artykułu
Porównanie postaci
Znaki są faktycznie reprezentowane w komputerze według liczb. Tak więc, porównując znaki, są to liczby, które są porównywane.
Zamówienie porównywania znaków, które tworzą literały ciągów, jest następujące: Cyfry są pierwsze przed wielkimi literami, które pojawiają się przed małymi literami. Inne znaki, takie jak dzwonek, karta, klawisz Enter, $, &, the [, backslash, , the | i, są umieszczane przed lub po lub w odstępach tych zakresów. Porównanie znaków w C ++ używa operatorów relacyjnych i równości, które są:
< meaning, less thanKlasa ciągów używa również tych operatorów do porównania literałów ciągów.
Notatka: Postać jest singlem i jest wyznaczona przez pojedyncze cytaty.
Każde z następujących dwóch stwierdzeń wydrukuje 1, dla True:
Cout << ('5' < 'E') << endl;
Cout << ('E' < 'e') << endl;
Każde z następujących dwóch instrukcji wydrukuje 1 dla true:
Cout << ('E' <= 'E') << endl;
Cout << ('E' >= 'E') << endl;
Poniższe oświadczenie drukuje 1, dla True:
Cout << ('e' == 'e') << endl;
Poniższe oświadczenie drukuje 1, dla True:
Cout << ('e' != 'E') << endl;
Obiekty klasy ciągu
Po uwzględnieniu biblioteki ciągów z Dyrective Directive, obiekt ciągów można utworzyć (konstruowany) w C ++, na następujący sposób:
String str = "jak to możliwe? - 50 000 $!";
String str = string ("jak to zrobić? - 50 000 $!");
string str = string ('h', „o ',„ w ”,”, „c”, „o”, „m”, „e”,', '?', ","-",",' $ ',' 5 ',' ',', ',', '', '0', '0', '!',' \ 0 ');
String literał dla tych trzech przypadków jest taki sam. Zwróć jednak uwagę na znak NUL „\ 0”, na końcu zawartości tablicy.
W tym dosłownym sznurku jest już sześć znaków niealfabetycznych, które są ”?', „$', '-', ',', ',',!„I przestrzeń (”). Wyobraź sobie nowy słownik, w którym znaki niealfabetyczne są używane w słowa. Wiesz już, jak porównać słowa w normalnym słowniku. C ++ porównuje literały smyczkowe w ten sam sposób w tym nowym słowniku.
Pamiętaj, aby porównać literały ciągów w C ++, porównaj obiekty ciągów reprezentowane przez ich identyfikatory.
Operacja równości
Operator równy jest, == . Składnia to:
Stra == STRB
Jeśli treść Stra jest taka sama jak treść STRB, szanowanie obudowy (nie ignorowanie kapitału i małych liter), wynik operacji jest prawdziwy.
Nierówny operator jest, != . Składnia to:
Stra != STRB
Najmniejsza różnica w zawartości, między STRA i STRB, szanując obudowę (nie ignorując kapitał i małe litery), powoduje fałszywe, dla tej operacji.
Rozważ następujący kod:
String str1 = "$ monega [26]";
String str2 = "$ monega [26]";
bool bla = str1 == str2;
Cout << blA << endl;
String str3 = "$ monega [26]";
String str4 = "$ monega [26]";
Bool Blb = Str3 == Str4;
Cout << blB << endl;
Wyjście to:
1 // dla prawda
0 // dla fałszu
Sekwencje są takie same dla literałów STR1 i STR2; Tak więc wartość zwracania jest prawdziwa. Sekwencje są takie same dla literałów STR3 i STR4; Ale jeden literał łańcuchowy ma mały tekst, a drugi ma wielkie tekst; Tak więc wartość zwracania jest fałszywa.
Poniżej powtarzano powyższy kod, ale z „z„!= ”Zamiast„ == ”.
String str1 = "$ monega [26]";
String str2 = "$ monega [26]";
bool bla = str1 != str2;
Cout << blA << endl;
String str3 = "$ monega [26]";
String str4 = "$ monega [26]";
Bool Blb = Str3 != str4;
Cout << blB << endl;
Wyjście to:
0 // dla fałszu
1 // dla prawda
Ignorowanie przypadku w porównaniu
Na razie C ++ nie ma funkcji do porównywania ciągów, ignorując sprawę. Sposobem na to jest konwersja obu ciągów na wielką część przed porównanie. Biblioteka algorytmu będzie musiała zostać uwzględniona. Ta biblioteka ma funkcję Transform (), która konwersja na wielką część. Dla stwierdzenia,
String str = "kocham 1000 USD.";
Konstrukt,
Transform (str.początek (), str.end (), str.początek (), :: toupper);
Zmieni dosłownie reprezentowane przez str, na:
„Uwielbiam 1000 USD."
Zauważ, że postacie niealfabetyczne, takie jak „$”, '.„A przestrzeń nie zmieniła się (ponieważ nie mają wyższych i małych wariantów).
Poniższy program wykorzystuje ten schemat do porównania literałów ciągów, ignorując przypadek:
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()
String str3 = "$ monega [26]";
Transform (STR3.początek (), str3.end (), str3.początek (), :: toupper);
String str4 = "$ monega [26]";
Transform (STR4.początek (), STR4.end (), STR4.początek (), :: toupper);
Bool Blb = Str3 == Str4;
Cout << blB << endl;
powrót 0;
Wyjście wynosi 1, dla prawdziwych, ponieważ oba ciągi są teraz w wielkim poziomie, każda inna rzecz jest równa.
Mniej niż, większy niż
Stra < strB
Powoduje, że jeśli dosłowność stra.
Stra> Strb
Powoduje prawdziwe, jeśli dosłowność stra.
Poniższy kod zwraca prawdziwie, ponieważ „WXYZ” jest mniej niż „wxyz”:
String str1 = "wxyz";
String str2 = "wxyz";
Bool Bl = Str1 < str2;
Cout << bl << endl;
Wyjście to 1. Poniższy kod zwraca prawdziwie, ponieważ „Stuv” jest mniej niż „wxyz”:
String str1 = „Stuv”;
String str2 = "wxyz";
Bool Bl = Str1 < str2;
Cout << bl << endl;
Dane wyjściowe to 1, dla prawda. Poniższy kod zwraca false, ponieważ „WXYZ” jest równy „WXYZ”, a STR1 nie jest mniej niż STR2.
String str1 = "wxyz";
String str2 = "wxyz";
Bool Bl = Str1 < str2;
Cout << bl << endl;
Wyjście to 0. Poniższy kod zwraca prawdziwie, ponieważ „WXY” jest większy niż „BCDE”:
String str1 = "wxy";
String str2 = "bcde";
bool Bl = str1> str2;
Cout << bl << endl;
Wyjście to 1.
Mniejsze lub równe, większe lub równe
Stra <= strB
Powoduje prawdziwe, jeśli dosłowność stra.
Stra> = STRB
Powoduje prawdziwe, jeśli dosłowność stra.
Poniższy kod zwraca prawdziwie, ponieważ „wxyz” jest mniejsze lub równe „wxyz”:
String str1 = "wxyz";
String str2 = "wxyz";
Bool Bl = Str1 <= str2;
Cout << bl << endl;
Wyjście to 1. Poniższy kod zwraca prawdziwie, ponieważ „Stuv” jest mniejsze lub równe „WXYZ”:
String str1 = „Stuv”;
String str2 = "wxyz";
Bool Bl = Str1 <= str2;
Cout << bl << endl;
Wyjście to 1. Poniższy kod zwraca prawdziwie, ponieważ „wxyz” jest mniejsze lub równe „wxyz” (a STR1 nie jest mniejsze niż STR2).
String str1 = "wxyz";
String str2 = "wxyz";
Bool Bl = Str1 <= str2;
Cout << bl << endl;
Wyjście to 1. Poniższy kod zwraca prawdziwie, ponieważ „WXY” jest większy lub równy „BCDE”:
String str1 = "wxy";
String str2 = "bcde";
bool Bl = str1> = str2;
Cout << bl << endl;
Wyjście to 1.
Wniosek
Aby porównać znaki w C ++, użyj operatorów równości i relacyjnych. Aby porównać literały ciągów, nadal używaj operatorów równości i relacyjnych, ale dla obiektów klasy ciągów, a nie dla const char*s. Korzystanie z operatorów dla const char*s porównuje wskaźniki, a nie literały smyczkowe.