Declarații cu șiruri
Un șir în limbajul C este o matrice unidimensională de caractere, ultimul element al căruia este caracterul de sfârșit de linie - zero (un șir terminat cu nul, adică șir terminat cu NULL).
Există trei moduri de a declara o variabilă de tip șir în C, dintre care două inițializează șirul în momentul declarării.
Prima cale:
Declarații de matrice de caractere (nu uitați să adăugați spațiu pentru nulul final):
Caractere;
A doua cale:
Atribuiți unei variabile șir o valoare inițială (în acest caz, compilatorul poate calcula însuși lungimea șirului):
Char s = „Exemplu de inițializare șir”;
În dreapta semnului de atribuire este o constantă șir. Un zero ('\0') este adăugat automat la sfârșitul șirului. Constantele șirurilor de caractere sunt plasate într-o clasă de stocare statică.
A treia cale:
O indicație implicită că o matrice este utilizată. În partea stângă a semnului de atribuire, este indicat un indicator către simbol:
Char *s="A doua opțiune de inițializare";
Variabila s va fi un pointer către locația din RAM în care se află constanta șirului. Această formă de notație are o potențială eroare prin aceea că un pointer către un caracter este adesea denumit șir. Intrarea de mai jos este doar un indicator către un caracter, deoarece nu există spațiu pentru șir:
Char*s;
Introducerea unui șir de la dispozitivul de intrare standard (tastatură)
Există un set de funcții pentru lucrul cu șiruri. Pentru intrarea de la dispozitivul de intrare standard (tastatură), funcțiile de bibliotecă din modulul de intrare/ieșire standard sunt cel mai des utilizate: scanfȘi devine.
Pentru a introduce un șir folosind funcția scanf, folosește formatul « %s» , și rețineți că semnul adresei nu este utilizat înaintea identificatorului de rând « & » , deoarece o matrice unidimensională este deja reprezentată printr-un pointer către începutul său:
scanf("%s", s);
Funcţie devine() citește caractere până când ajunge la un caracter newline. Funcția acceptă toate caracterele până la, dar fără a include caracterul de nouă linie. Un zero final ('\0') este adăugat la sfârșitul șirului. Funcţie devine() pune o secvență de caractere citite de la tastatură într-un parametru șir și returnează un pointer către acel șir (dacă operația a avut succes) sau NULL (în cazul unei erori). În exemplul de mai jos, la finalizarea cu succes a operațiunii, pe ecran vor fi afișate două linii identice:
#include
În treacăt, observăm că funcția gets este adesea folosită pentru a introduce orice date de la tastatură ca șir în scopul conversiei ulterioare de către funcția sscanf în formatul dorit sau pentru analiza preliminară a datelor de intrare, de exemplu:
#include
Imprimarea șirurilor la ieșirea standard (ecranul monitorului)
Pentru a scoate șiruri de caractere la ieșirea standard (ecran de monitor), puteți utiliza două funcții printfȘi pune. În funcția printf, „%s” este transmis ca format. Comoditatea utilizării acestei funcții constă în faptul că, pe lângă șir, puteți afișa imediat date de alte tipuri. caracteristică caracteristică pune este că după ce linia este scoasă, trecerea la următoarea linie are loc automat.
Funcții șiruri
Pentru a converti șiruri în limbajul C, este furnizată biblioteca de șiruri. Fiecare dintre funcții are propriul format de înregistrare (prototip).
Cele mai utilizate funcții sunt discutate în acest articol. - a citi
Un exemplu de programe (listări) care lucrează cu șiruri
34--- Tutorial C# --- Șiruri
În ceea ce privește programarea obișnuită, șir tipul de date șir este una dintre cele mai importante din C#. Acest tip definește și acceptă șiruri de caractere. Într-un număr de alte limbaje de programare, un șir este o matrice de caractere. Și în C#, șirurile sunt obiecte. Prin urmare, tipul șir este unul dintre tipurile de referință.
Construcția rândurilor
Cel mai simplu mod de a construi un șir de caractere este să utilizați un șir literal. De exemplu, în următoarea linie de cod, variabilei de referință șir str i se atribuie o referință la un literal șir:
String str = „Exemplu șir”;
În acest caz, variabila str este inițializată cu secvența de caractere „Example String”. Un obiect de tip șir poate fi creat și dintr-o matrice de tip char. De exemplu:
Chararray = ("e", "x", "a", "m", "p", "l", "e"); șir str = șir nou (chararray);
Odată ce un obiect de tip șir a fost creat, acesta poate fi folosit oriunde este necesar un șir de text citat.
Persistența șirului
În mod ciudat, conținutul unui obiect de tip șir nu poate fi modificat. Aceasta înseamnă că, odată ce o secvență de caractere a fost creată, aceasta nu poate fi modificată. Dar această limitare contribuie la o implementare mai eficientă a șirurilor de caractere. Prin urmare, acesta, la prima vedere, un dezavantaj evident se transformă de fapt într-un avantaj. Astfel, dacă un șir este necesar ca o variație a unui șir deja existent, atunci în acest scop ar trebui creat un șir nou care să conțină toate modificările necesare. Și din moment ce obiectele șir neutilizate sunt colectate automat în „gunoi”, atunci nici măcar nu trebuie să vă faceți griji cu privire la soarta șirurilor inutile.
Cu toate acestea, trebuie subliniat faptul că variabilele de referință șir (adică obiecte de tip șir) sunt supuse modificării și, prin urmare, se pot referi la un alt obiect. Dar conținutul obiectului șir în sine nu se schimbă după ce a fost creat.
Luați în considerare un exemplu:
Static void addNewString() ( șir s = „Acesta este accident vascular cerebral”; s = „Acesta este accident vascular cerebral nou”; )
Să compilam aplicația și să încărcăm ansamblul rezultat în utilitarul ildasm.exe. Figura arată codul CIL care va fi generat pentru metoda void addNewString():
Observați apelurile multiple către opcode ldstr (încărcare șir). Acest opcode ldstr în CIL determină încărcarea unui nou obiect șir în heap-ul gestionat. Ca rezultat, obiectul anterior care conținea valoarea „Acesta este lovitura mea” va fi în cele din urmă colectat de gunoi.
Lucrul cu șiruri
În clasă System.String este furnizat un set de metode pentru determinarea lungimii datelor de caractere, căutarea unui subșir în șirul curent, conversia caracterelor din majuscule în litere mici și invers și așa mai departe. Ne vom uita la această clasă mai detaliat în continuare.
Câmp, indexator și proprietatea clasei String
Clasa String are un singur câmp definit:
Șir public static numai pentru citire Gol;
Câmpul Gol denotă un șir gol, adică un șir care nu conține caractere. Aceasta este diferită de o referință String goală, care este pur și simplu făcută la un obiect inexistent.
În plus, clasa String definește un singur indexator numai pentru citire:
Public char this ( obține; )
Acest indexator vă permite să obțineți caracterul la indexul specificat. Indexarea șirurilor, ca și tablourile, începe de la zero. Obiectele String sunt persistente și nu se modifică, așa că are sens ca clasa String să accepte un indexator doar pentru citire.
În cele din urmă, clasa String definește o singură proprietate numai pentru citire:
Public int Lungime ( get; )
Proprietatea Length returnează numărul de caractere dintr-un șir. Exemplul de mai jos arată utilizarea unui indexator și a proprietății Length:
Utilizarea sistemului; Exemplu de clasă ( static void Main() ( string str = "Șir simplu"; // Obține lungimea șirului și al șaselea caracter din șir folosind indexerul Console.WriteLine ("Lungimea șirului este (0), al șaselea caracter este "(1)""" , str.Lungime, str); ) )
Operatori de clasă șiruri
Clasa String supraîncarcă următorii doi operatori: == și !=. Operatorul == este folosit pentru a testa două șiruri de caractere pentru egalitate. Când operatorul == este aplicat referințelor la obiect, de obicei verifică dacă ambele referințe sunt la același obiect. Și când operatorul == este aplicat referințelor de obiecte de tip String, conținutul șirurilor în sine este comparat pentru egalitate. Același lucru este valabil și pentru operatorul !=. Când este aplicat referințelor de obiecte de tip String, conținutul șirurilor în sine este comparat pentru inegalitate. În același timp, alți operatori relaționali, inclusiv =, compară referințele la obiecte de tip String în același mod ca și la obiecte de alte tipuri. Și pentru a verifica dacă un șir este mai mare decât altul, ar trebui să apelați metoda Compare() definită în clasa String.
După cum va deveni clar mai târziu, multe tipuri de comparații de șiruri de caractere folosesc informații culturale. Dar acest lucru nu se aplică operatorilor == și !=. La urma urmei, pur și simplu compară valorile ordinale ale caracterelor din șiruri. (Cu alte cuvinte, ei compară valorile caracterelor binare care nu au fost modificate de normele culturale, adică de locații.) Prin urmare, acești operatori efectuează comparații de șiruri într-o manieră care nu ține seama de majuscule și de cultură.
Metode ale clasei de șiruri
Următorul tabel listează câteva dintre cele mai interesante metode ale acestei clase, grupate după scop:
Metodă | Structură și versiuni supraîncărcate | Scop |
---|---|---|
Comparație de șiruri | ||
Comparaţie() | public static int Compare(șir strA, șir strB) Public static int Compare (șir strA, șir strB, bool ignoreCase) Public static int Compare(șir strA, șir strB, StringComparison comparisonType) Public static int Compare (șir strA, șir strB, bool ignoreCase, cultură CultureInfo) |
Metodă statică, compară șirul strA cu șirul strB. Returnează pozitiv dacă strA este mai mare decât strB; negativ dacă strA este mai mic decât strB; și zero dacă șirurile strA și strB sunt egale. Comparația ține cont de majuscule și minuscule și sensibilă cultural. Dacă parametrul ignoreCase este setat la valoarea booleană true, atunci comparația nu ia în considerare diferențele dintre literele mari și mici. În caz contrar, aceste diferențe sunt luate în considerare. Parametrul comparisonType specifică modul specific în care sunt comparate șirurile. Clasa CultureInfo este definită în spațiul de nume System.Globalization. |
public static int Compare (șir strA, int indexA, șir strB, int indexB, int lungime) Public static int Compare (șir strA, int indexA, șir strB, int indexB, int lungime, bool ignoreCase) Public static int Compare(șir strA, int indexA, șir strB, int indexB, int lungime, StringComparison comparisonType) Public static int Compare (șir strA, int indexA, șir strB, int indexB, int lungime, bool ignoreCase, cultură CultureInfo) |
Compară părți ale șirurilor strA și strB. Comparația începe cu elementele șir strA și strB și include numărul de caractere specificat de parametrul lungime. Metoda returnează o valoare pozitivă dacă o parte din strA este mai mare decât o parte din strB; o valoare negativă dacă o parte din strA este mai mică decât o parte din strB; și zero dacă părțile comparate ale șirurilor strA și strB sunt egale. Comparația ține cont de majuscule și minuscule și sensibilă cultural. |
|
comparaOrdinal() | public static int CompareOrdinal(șir strA, șir strB) Public static int CompareOrdinal(șir strA, int indexA, șir strB, int indexB, int număr) |
Face la fel ca metoda Compare(), dar fără a ține cont de setările locale |
Compara cu() | public int CompareTo(valoarea obiectului) | Compară șirul de apelare cu reprezentarea șir a obiectului valoare. Returnează o valoare pozitivă dacă șirul de apelare este mai mare decât valoarea șirului; o valoare negativă dacă șirul de apelare este mai mic decât șirul de valoare; și zero dacă șirurile comparate sunt egale |
public int CompareTo(string strB) | Compară șirul de apelare cu strB |
|
este egal() | public override bool Equals(object object) | Returnează valoarea booleană adevărată dacă șirul de apelare conține aceeași secvență de caractere ca și reprezentarea șir a lui obj. Efectuează o comparație ordinală, ținând cont de majuscule și minuscule, dar insensibilă din punct de vedere cultural |
public bool Egal (valoare șir) Public bool Equals (valoare șir, StringComparison comparisonType) |
Returnează valoarea booleană adevărată dacă șirul de apelare conține aceeași secvență de caractere ca și valoarea șirului. Se efectuează o comparație ordinală, ținând cont de majuscule, dar insensibilă din punct de vedere cultural. Parametrul comparisonType definește o modalitate specifică de a compara șirurile |
|
public static bool Egal (șir a, șir b) Public static bool Equals (șir a, șir b, StringComparison comparisonType) |
Returnează boolean adevărat dacă șirul a conține aceeași secvență de caractere ca șirul b. Se efectuează o comparație ordinală, ținând cont de majuscule, dar insensibilă din punct de vedere cultural. Parametrul comparisonType definește o modalitate specifică de a compara șirurile |
|
Concatenarea (conectarea) șirurilor | ||
Concat() | public static string Concat(string str0, string str1); public static string Concat(params string values); |
Combină instanțe de șir separate într-un singur șir (concatenare) |
Căutați într-un șir | ||
Conține() | public bool Conține (valoare șir) | O metodă care vă permite să determinați dacă un șir conține un anumit subșir (valoare) |
Incepe cu() | public bool StartsWith(valoare șir) Public bool StartsWith(valoare șir, tip de comparație StringComparison) |
Returnează valoarea booleană adevărată dacă șirul de apelare începe cu subșirul de valoare. În caz contrar, se returnează valoarea booleană false. Parametrul comparisonType specifică modul în care urmează să fie efectuată căutarea. |
Se termină cu() | public bool EndsWith(valoare șir) Public bool EndsWith(valoare șir, tip de comparație StringComparison) |
Returnează valoarea booleană adevărată dacă șirul de apelare se termină cu subșirul de valoare. În caz contrar, returnează valoarea booleană false. Parametrul comparisonType definește o anumită metodă de căutare |
Index de() | public int IndexOf(valoare caracter) Public int IndexOf(valoare șir) |
Găsește prima apariție a unui subșir sau caracter dat într-un șir. Dacă caracterul sau subșirul pe care îl căutați nu este găsit, atunci este returnat -1. |
public int IndexOf(valoare caracter, int startIndex) Public int IndexOf(valoare șir, int startIndex) Public int IndexOf(valoare caracter, int startIndex, int număr) Public int IndexOf(valoare șir, int startIndex, int număr) |
Returnează indexul primei apariții a caracterului sau a valorii subșirului din șirul de apelare. Căutarea începe de la elementul specificat la index startIndex și se întinde pe numărul de elemente specificat de parametrul count (dacă este specificat). Metoda returnează -1 dacă caracterul sau subșirul căutat nu este găsit |
|
LastIndexOf() | Versiunile supraîncărcate sunt similare cu metoda IndexOf(). | La fel ca IndexOf, dar găsește ultima apariție a unui caracter sau subșir în loc de prima |
IndexOfAny() | public int IndexOfAny(char anyOf) Public int IndexOfAny(char anyOf, int startIndex) Public int IndexOfAny(char anyOf, int startIndex, int număr) |
Returnează indexul primei apariții a oricărui caracter din tabloul anyOf găsit în șirul de apelare. Căutarea începe de la elementul specificat de index startIndex și se întinde pe numărul de elemente specificat de parametrul count (dacă există). Metoda returnează -1 dacă nu se găsește nicio potrivire pentru niciunul dintre caracterele din tabloul anyOf. Căutarea se efectuează în mod ordinal |
LastIndexOfAny | Versiunile supraîncărcate sunt similare cu metoda IndexOfAny(). | Returnează indexul ultimei apariții a oricărui caracter din tabloul anyOf găsit în șirul de apelare |
Împărțirea și concatenarea șirurilor | ||
Despică | șir public Split(params char separator) Șir public Split(params char separator, int count) |
O metodă care returnează o matrice de șiruri cu subșiruri prezente în această instanță, separate unele de altele prin elemente din matricea de șiruri de caractere specificată. Prima formă a metodei Split() împarte șirul de apelare în părțile sale componente. Rezultatul este o matrice care conține subșirurile preluate din șirul de apelare. Caracterele care delimitează aceste subșiruri sunt trecute în tabloul separator. Dacă matricea de separare este goală sau se referă la un șir gol, atunci un spațiu este folosit ca separator de subșir. Și în a doua formă a acestei metode, se returnează numărul de subșiruri determinat de parametrul count. |
șir public Split (params char separator, opțiuni StringSplitOptions) Split șir public (separator șir, opțiuni StringSplitOptions) Split șir public (params char separator, int count, StringSplitOptions opțiuni) Split șir public (separator șir, număr int, opțiuni StringSplitOptions) |
Primele două forme ale metodei Split() împart șirul de apelare în părți și returnează o matrice care conține subșirurile obținute din șirul de apelare. Caracterele care separă aceste subșiruri sunt transmise în tabloul separator. Dacă matricea de separare este goală, atunci un spațiu este folosit ca separator. Și în a treia și a patra formă a acestei metode, se returnează numărul de rânduri, limitat de parametrul count. Dar în toate formele, parametrul opțiuni specifică o modalitate specifică de a gestiona șirurile goale, care sunt generate atunci când doi delimitatori sunt adiacenți. Enumerarea StringSplitOptions definește doar două valori: Nici unulȘi EliminațiEmptyEntries. Dacă parametrul opțiuni este None, atunci șirurile goale sunt incluse în rezultatul final al împărțirii șirului original. Și dacă parametrul opțiuni este setat la RemoveEmptyEntries, atunci șirurile goale sunt excluse din rezultatul final al împărțirii șirului original. |
|
A te alatura() | Join string public static (separator șir, valoare șir) Unire șir static public (separator șir, valoare șir, int startIndex, int număr) |
Construiește un șir nou combinând conținutul unei matrice de șiruri. Prima formă a metodei Join() returnează un șir format din subșiruri concatenate trecute în tabloul de valori. Cea de-a doua formă returnează, de asemenea, un șir format din subșirurile trecute în tabloul de valori, dar acestea sunt concatenate un anumit număr de contorizări, începând de la elementul matricei de valori. În ambele forme, fiecare linie succesivă este separată de linia anterioară printr-un șir separator specificat de parametrul separator. |
Linii de umplere și tăiere | ||
tunde() | șir public Trim() șir public Trim(params char trimChars) |
O metodă care vă permite să eliminați toate aparițiile unui set specificat de caractere de la începutul și sfârșitul șirului curent. Prima formă a metodei Trim() elimină spațiile de început și de final din șirul de apelare. Și a doua formă a acestei metode elimină aparițiile de început și de sfârșit din șirul de caractere de apelare din tabloul trimChars. Ambele forme returnează șirul rezultat. |
PadLeft() | șir public PadLeft(int totalWidth) Șir public PadLeft(int totalWidth, char paddingChar) |
Vă permite să completați șirul cu caractere din stânga. Prima formă a metodei PadLeft() inserează spații în partea stângă a șirului de apelare, astfel încât lungimea sa totală să fie egală cu valoarea parametrului totalWidth. În a doua formă a acestei metode, caracterele indicate de parametrul paddingChar sunt introduse în partea stângă a șirului de apelare, astfel încât lungimea sa totală să devină egală cu valoarea parametrului totalWidth. Ambele forme returnează șirul rezultat. Dacă valoarea parametrului totalWidth este mai mică decât lungimea șirului de apelare, atunci este returnată o copie a șirului de apelare nemodificat. |
PadRight() | Similar cu PadLeft() | Vă permite să completați șirul cu caractere la dreapta. |
Inserarea, ștergerea și înlocuirea rândurilor | ||
Introduce() | șir public Inserare (int startIndex, valoare șir) | Folosit pentru a insera un șir în altul, unde value este șirul care trebuie inserat în șirul de apelare la index startIndex. Metoda returnează șirul rezultat. |
Elimina() | șir public Remove(int startIndex) Șir public Eliminare (int startIndex, int număr) |
Folosit pentru a elimina o parte dintr-un șir. În prima formă a metodei Remove(), eliminarea este efectuată începând de la locația specificată de index startIndex și continuând până la sfârșitul șirului. Și în a doua formă a acestei metode, numărul de caractere specificat de parametrul count este eliminat din șir, începând de la locul specificat de indexul startIndex. |
A inlocui() | șir public Înlocuire (char oldChar, char newChar) Șir public Înlocuire (șir vechiValoare, șir newValue) |
Folosit pentru a înlocui o parte dintr-un șir. Prima formă a metodei Replace() înlocuiește toate aparițiile lui oldChar din șirul de apelare cu newChar. Și în a doua formă a acestei metode, toate aparițiile șirului oldValue din șirul apelant sunt înlocuite cu șirul newValue. |
Schimbarea cazului | ||
În sus() | șir public ToUpper() | Scrie cu majuscule toate literele din șirul de apelare. |
Pentru a reduce() | șir public ToLower() | Face toate literele din șirul de apelare cu minuscule. |
Obținerea unui subșir dintr-un șir | ||
subșir () | șir public Subșir (int startIndex) Șir public Subșir (int startIndex, int lungime) |
În prima formă a metodei Substring(), subșirul este extras din locația indicată de parametrul startIndex până la sfârșitul șirului de apelare. Și în cea de-a doua formă a acestei metode se extrage un subșir, format din numărul de caractere specificat de parametrul lungime, începând de la locul indicat de parametrul startIndex. |
Următorul exemplu de program utilizează mai multe dintre metodele de mai sus:
Utilizarea sistemului; folosind System.Collections.Generic; folosind System.Linq; folosind System.Text; namespace ConsoleApplication1 ( clasa Program ( static void Main(string args) ( // Compara primele două șiruri șir s1 = „acesta este un șir"; șir s2 = „acesta este text, acesta este un șir"; if (String.CompareOrdinal (s1, s2) != 0) Console.WriteLine(„Șirurile s1 și s2 nu sunt egale”); if (String.Compare(s1, 0, s2, 13, 10, true) == 0) Console.WriteLine( „Totuși, acestea conțin același text”); // Concatenare șiruri Console.WriteLine(String.Concat("\n" + "Unu, doi ","trei, patru")); // Căutare în șir // Prima apariție de subșir dacă (s2. IndexOf(„acest”) != -1) Console.WriteLine(„Cuvântul \”acest\” a fost găsit în linie, este „+ ”la: (0) poziție”, s2. IndexOf(„this”)); // Ultima apariție a subșirului dacă (s2.LastIndexOf(„this”) != -1) Console.WriteLine(„Ultima apariție a „this” este „ + „la ( 0) poziție", s2.LastIndexOf("this" )); // Căutare din matricea de caractere char myCh = ("S","x","t"); if (s2.IndexOfAny(myCh) != -1) Console.WriteLine("Unul dintre caracterele din tabloul ch "+" găsit în linia curentă la poziţia (0)", s2.IndexOfAny(myCh)); // Stabilește dacă șirul începe cu subșirul dat if (s2.StartsWith("acesta este text") == true) Console.WriteLine("Subșir găsit!"); // Determinați dacă șirul conține un subșir // folosind exemplul de determinare a șirului de sistem de operare al utilizatorului myOS = Environment.OSVersion.ToString(); if (myOS.Contains ("NT 5.1")) Console.WriteLine ("Sistemul dvs. de operare este Windows XP"); else if (myOS.Contains ("NT 6.1")) Console.WriteLine ("Sistemul dvs. de operare este Windows 7"); Console.ReadLine(); ) ) )
Un pic despre compararea șirurilor în C#
Dintre toate operațiunile de procesare a șirurilor de caractere, este probabil cea mai frecventă comparare a unui șir cu altul. Înainte de a analiza oricare dintre metodele de comparare a șirurilor, trebuie subliniate următoarele: compararea șirurilor se poate face în .NET Framework în două moduri principale:
În primul rând, comparația poate reflecta obiceiurile și normele unui anumit mediu cultural, care sunt adesea setări culturale care intră în vigoare atunci când un program este executat. Acesta este un comportament standard pentru unele, deși nu pentru toate, metodele de comparație.
Și în al doilea rând, comparația poate fi efectuată indiferent de setările mediului cultural doar pe valorile ordinale ale caracterelor care alcătuiesc șirul. În general, compararea șirurilor de caractere insensibilă din punct de vedere cultural utilizează ordinea lexicografică (și caracteristicile lingvistice) pentru a determina dacă un șir este mai mare decât, mai mic sau egal cu un alt șir. Într-o comparație ordinală, șirurile sunt pur și simplu ordonate pe baza valorii nemodificate a fiecărui caracter.
Din cauza diferențelor în modul în care sunt comparate șirurile între culturi și comparațiile ordinale și a implicațiilor fiecărei astfel de comparații, vă recomandăm insistent să utilizați cele mai bune practici oferite în prezent de Microsoft. La urma urmei, alegerea modului greșit de a compara șirurile poate duce la funcționarea incorectă a programului atunci când acesta este operat într-un mediu diferit de cel în care a fost dezvoltat.
Alegerea modului de comparare a șirurilor de caractere este o decizie foarte importantă. Ca regulă generală, și fără excepție, ar trebui să alegeți o comparație de șiruri sensibilă din punct de vedere cultural dacă aceasta are scopul de a afișa rezultatul utilizatorului (de exemplu, pentru a afișa o serie de șiruri sortate în ordine lexicografică). Dar dacă șirurile conțin informații fixe care nu sunt menite să fie modificate pentru diferențele culturale, cum ar fi un nume de fișier, un cuvânt cheie, o adresă de site web sau o valoare legată de securitate, atunci ar trebui să alegeți o comparație de șiruri ordinale. Desigur, specificul anumitor aplicații dezvoltate va dicta alegerea unui mod adecvat de a compara șirurile de caractere.
Clasa String oferă o varietate de metode de comparare a șirurilor, care sunt enumerate în tabelul de mai sus. Cea mai versatilă dintre ele este metoda Compare(). Vă permite să comparați două șiruri de caractere integral sau parțial, diferențiate de majuscule sau minuscule, într-un mod de comparare determinat de parametrul tip StringComparison, precum și informațiile culturale furnizate de parametrul tip CultureInfo.
Acele supraîncărcări ale metodei Compare() care nu conțin un parametru de tip StringComparison efectuează o comparație a șirurilor de caractere care ține seama de majuscule și cultură. Și în acele variante supraîncărcate care nu conțin un parametru de tip CultureInfo, informațiile de cultură sunt determinate de mediul de rulare curent.
Tipul StringComparison este o enumerare care definește valorile prezentate în tabelul de mai jos. Folosind aceste valori, puteți organiza comparații de șiruri care se potrivesc nevoilor aplicației dvs. Prin urmare, adăugarea unui parametru de tip StringComparison extinde capacitățile metodei Compare() și ale altor metode de comparare, cum ar fi Equals(). De asemenea, face posibilă specificarea fără ambiguitate a modului în care trebuie să fie comparate șirurile.
Din cauza diferențelor dintre comparațiile de șiruri sensibile din punct de vedere cultural și comparațiile ordinale, este important să fii cât mai precis posibil în acest sens.
Sens | Descriere |
---|---|
CurrentCulture | Compararea șirurilor se face folosind setările curente de cultură |
CurrentCultureIgnoreCase | Compararea șirurilor este efectuată folosind setările curente de cultură, dar nu ține seama de majuscule și minuscule |
InvariantCulture | Comparația șirurilor se face folosind cele imuabile, adică date universale despre mediul cultural |
InvariantCultureIgnoreCase | Comparația șirurilor se face folosind cele imuabile, adică date culturale universale și insensibile la majuscule și minuscule |
Ordinal | Compararea șirurilor se realizează folosind valorile ordinale ale caracterelor din șir. În acest caz, ordinea lexicografică poate fi încălcată, iar convențiile adoptate într-un anumit mediu cultural sunt ignorate. |
OrdinalIgnoreCase | Compararea șirurilor se realizează folosind valorile ordinale ale caracterelor din șir, dar nu ține seama de majuscule și minuscule |
În ambele cazuri, metoda Compare() returnează o valoare negativă dacă primul șir comparat este mai mic decât al doilea; o valoare pozitivă dacă primul șir comparat este mai mare decât al doilea; și în final zero dacă ambele șiruri comparate sunt egale. Deși metoda Compare() returnează zero dacă șirurile comparate sunt egale, în general este mai bine să folosiți metoda Equals() sau operatorul == pentru a determina dacă șirurile de caractere sunt egale.
Faptul este că metoda Compare() determină egalitatea șirurilor comparate pe baza ordinii lor de sortare. De exemplu, dacă șirurile sunt comparate cultural, ambele șiruri pot fi aceleași în ordinea lor de sortare, dar nu sunt în esență egale. În mod implicit, egalitatea șirurilor este determinată în metoda Equals(), pe baza valorilor ordinale ale caracterelor și nu cultural. Prin urmare, în mod implicit, ambele șiruri sunt comparate în această metodă pentru egalitate absolută, caracter cu caracter, similar cu modul în care se face în operatorul ==.
În ciuda versatilității mari a metodei Compare(), pentru o comparație ordinală simplă a șirurilor de caractere, este mai ușor să utilizați metoda CompareOrdinal(). În cele din urmă, rețineți că metoda CompareTo() compară doar șirurile într-o manieră sensibilă din punct de vedere cultural.
Următorul program demonstrează utilizarea metodelor Compare(), Equals(), CompareOrdinal() și a operatorilor == și != pentru a compara șirurile de caractere. Rețineți că primele două exemple de comparație demonstrează în mod clar diferențele dintre comparația de șiruri sensibilă cultural și comparația ordinală engleză:
Utilizarea sistemului; Exemplu de clasă ( static void Main() ( șir str1 = "alfa"; șir str2 = "Alfa"; șir str3 = "Beta"; șir str4 = "alfa"; șir str5 = "alfa, beta"; rezultat int; / / Mai întâi, demonstrați diferența dintre compararea șirurilor sensibile la cultură și rezultatul comparației ordinale = String.Compare(str1, str2, StringComparison.CurrentCulture); Console.Write("Compararea șirurilor sensibile la cultură: "); if (rezultat 0 ) Console .WriteLine(str1 + " este mai mare decât " + str2); altfel Console.WriteLine(str1 + "este " + str2); rezultat = String.Compare(str1, str2, StringComparison.Ordinal); Console.Write("Comparație ordinală linii: "); dacă (rezultatul 0) Console.WriteLine(str1 + " este mai mare decât " + str2); altfel Console.WriteLine(str1 + "este egal cu " + str4); // Utilizați rezultatul metodei CompareOrdinal() = String.CompareOrdinal( str1, str2); Console.Write("Comparați șirurile folosind CompareOrdinal():\n"); if (rezultat 0) Console.WriteLine(str1 + "mai mare decât " + str2); else Console.WriteLine (str 1 + "este egal cu " + str4); Console.WriteLine(); // Determinați egalitatea șirurilor folosind operatorul == // Aceasta este o comparație ordinală a șirurilor de caractere if (str1 == str4) Console.WriteLine(str1 + " == " + str4); // Detectează inegalitatea liniilor folosind operatorul != if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Consola.WriteLine(str1 + " != " + str2); Console.WriteLine(); // Efectuați o comparație ordinală de șiruri care nu ține seama de majuscule, folosind metoda Equals() if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Compararea șirurilor folosind metoda Equals() cu parametrul " + " OrdinalIgnoreCase: \n" + str1 + " este egal cu " + str2); Console.WriteLine(); // Comparați părți ale șirurilor de caractere if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Compararea șirurilor pe baza culturii curente:" + "\n3 primele caractere a șirului " + str2 + " este mai mare decât primele 3 caractere ale șirului " + str5); ) ) )
Rularea acestui program produce următorul rezultat:
Standardul modern C++ definește o clasă cu funcții și proprietăți (variabile) pentru organizarea muncii cu șiruri de caractere (nu există șiruri de caractere ca atare în limbajul C clasic, există doar tablouri de caractere):
#include
#include#include
Pentru a lucra cu șiruri, trebuie să includeți și un spațiu de nume standard:
Utilizarea namespace std;
În caz contrar, va trebui să specificați descriptorul de clasă std::string în loc de șir peste tot.
Următorul este un exemplu de program care funcționează cu șir (nu funcționează în vechile compilatoare compatibile cu C!):
#include
Principalele caracteristici pe care le are clasa string:
- inițializare cu o matrice de caractere (un șir încorporat) sau alt obiect de tip string . Tipul încorporat nu are a doua capacitate;
- copierea unei linii pe alta. Pentru un tip încorporat, trebuie să utilizați funcția strcpy();
- acces la caracterele individuale ale unui șir pentru citire și scriere. În matricea încorporată, acest lucru se face folosind operația de index sau adresare indirectă folosind un pointer;
- comparând două șiruri de caractere pentru egalitate. Pentru un tip încorporat sunt folosite funcțiile familiei strcmp();
- concatenare (concatenare) a două șiruri, dând rezultatul fie ca al treilea șir, fie în locul unuia dintre cele originale. Pentru un tip încorporat, se folosește funcția strcat(), dar pentru a obține rezultatul într-o linie nouă, trebuie să utilizați funcțiile strcpy() și strcat() în secvență și, de asemenea, să aveți grijă de alocarea memoriei;
- mijloace încorporate pentru determinarea lungimii unui șir (funcții membre ale clasei size() și l ength()). Singura modalitate de a afla lungimea unui șir de tip încorporat este calculând-o cu funcția strlen();
- capacitatea de a afla dacă un șir este gol.
Să aruncăm o privire mai atentă la aceste caracteristici de bază.
Inițializare șir când descrie şi lungimea șirului(fără a include terminatorul nul de terminare):
String st("Șirul meu\n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";
Șirul poate fi, de asemenea, gol:
Str 2;
Pentru a verifica dacă este șirul gol, puteți compara lungimea sa cu 0:
dacă (!st.size()) // gol
sau utilizați metoda empty(), care returnează true pentru un șir gol și false pentru unul nevid:
if (st.empty()) // gol
A treia formă de creare a șirului inițializează un obiect de tip șir cu un alt obiect de același tip:
St3 st3(st);
Șirul st3 este inițializat cu șirul st . Cum ne putem asigura că acestea corzile se potrivesc? Să folosim operatorul de comparație (==):
Dacă (st == st3) // inițializarea a reușit
Cum copiați o linie pe alta? Cu operatorul obișnuit de atribuire:
st2 = st3; // copiați st3 în st2
Pentru concatenare de șiruri se utilizează operatorul de adăugare (+) sau operatorul de adăugare-alocare (+=). Să fie date două linii:
String s1 ("bună ziua, "); șir s2(„lume\n”);
Putem obține un al treilea șir format din concatenarea primelor două, astfel:
Șirul s3 = s1 + s2;
Dacă vrem să adăugăm s2 la sfârșitul lui s1, trebuie să scriem:
S1 += s2;
Operația de adăugare poate concatena obiecte de clasă şir nu numai între ele, ci și cu șiruri de tip încorporat. Puteți rescrie exemplul de mai sus, astfel încât caracterele speciale și semnele de punctuație să fie reprezentate de tipul încorporat char * , iar cuvintele semnificative să fie reprezentate de obiecte din șirul clasei:
Const char *pc = ", "; șir s1 ("bună ziua"); șir s2(„lume”); șir s3 = s1 + pc + s2 + "\n"; cout<< endl << s3;
Astfel de expresii funcționează deoarece compilatorul „știe” cum să convertească automat obiectele de tip încorporat în obiecte de tip șir de clasă . De asemenea, este posibil să atribuiți pur și simplu un șir încorporat unui obiect șir:
Șirul s1; const char *pc = "o matrice de caractere"; s1=buc; // dreapta
Transformarea inversă este nu funcționează. Încercarea de a efectua următoarea inițializare a șirurilor de tip încorporat va cauza o eroare de compilare:
Char*str = s1; // eroare de compilare
Pentru a face această conversie, trebuie să apelați în mod explicit funcția membru numită c_str() ("șir C"):
Const char *str = s1.c_str();
Funcția c_str() returnează un pointer către o matrice de caractere care conține șirul obiectului șir, așa cum ar fi în tipul șir încorporat. Cuvântul cheie const aici previne posibilitatea „periculoasă” în mediile vizuale moderne de a modifica direct conținutul unui obiect prin intermediul unui pointer.
LA personaje individuale un obiect de tip string , ca un tip încorporat, poate fi accesat utilizând operația index. De exemplu, iată un fragment de cod care înlocuiește toate punctele cu caractere de subliniere:
String str("www.disney.com"); int size = str.size(); pentru (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;
Înlocuiește(str.begin(), str.end(), ".", "_");
Adevărat, nu metoda de înlocuire a clasei de șiruri este folosită aici, ci algoritmul cu același nume:
#include
Deoarece obiectul șir se comportă ca un container, i se pot aplica și alți algoritmi. Acest lucru vă permite să rezolvați probleme care nu sunt rezolvate direct de funcțiile clasei șir.
Mai jos este o scurtă descriere a principalelor operatori și funcții ale clasei șir de caractere, linkurile din tabel conduc la descrieri în limba rusă de pe Internet. Pentru o listă mai completă a capabilităților clasei șir, consultați, de exemplu, Wikipedia sau cplusplus.com.