Deklarisanje nizova
C string je jednodimenzionalni niz znakova, čiji je posljednji element null prekinuti niz (null terminated string).
Deklarisanje varijable tipa string u jeziku C moguće je na tri načina, od kojih dva inicijalizuju string tokom deklaracije.
prvi način:
Deklaracije niza znakova (ne zaboravite da dodate prostor za null na kraju):
Char s;
drugi način:
Dodijelite početnu vrijednost varijabli stringa (u ovom slučaju, kompajler može izračunati dužinu samog niza):
Char s = "Primjer inicijalizacije niza";
Konstanta niza je upisana desno od znaka dodjeljivanja. Nula ('\ 0') se automatski dodaje na kraj reda. Konstante niza znakova smještene su u statičku memorijsku klasu.
treći način:
Implicitna indikacija da se koristi niz. Lijevo od znaka zadatka je pokazivač na simbol:
Char * s = "Druga opcija inicijalizacije";
Varijabla s će biti pokazivač na lokaciju u RAM-u gdje se nalazi niz konstanta. Postoji potencijalna greška u ovom obliku notacije, a to je da se pokazivač na karakter često naziva stringom. Unos ispod je samo pokazivač na znak, pošto nema prostora za postavljanje niza:
Char * s;
Unos niza sa standardnog uređaja za unos (tastatura)
Postoji skup funkcija za rad sa stringovima. Za unos sa standardnog ulaznog uređaja (tastature) najčešće se koriste funkcije biblioteke iz standardnog ulazno-izlaznog modula: scanf i gets.
Za unos niza pomoću funkcije scanf, koristi format « % s» , i imajte na umu da se ispred identifikatora stringa ne koristi znak adrese « & » pošto je jednodimenzionalni niz već predstavljen pokazivačem na njegov početak:
Scanf ("% s", s);
Funkcija dobije ()čita znakove dok ne dođe do znaka za novi red. Funkcija prihvaća sve znakove do znaka za prijelaz na red, ali ga ne uključuje. Završna nula ('\ 0') se dodaje na kraj reda. Funkcija dobije () stavlja niz znakova pročitanih sa tastature u parametar tipa string i vraća pokazivač na ovaj niz (ako je operacija bila uspešna) ili NULL (u slučaju greške). U primjeru ispod, nakon uspješnog završetka operacije, na ekranu će se prikazati dvije identične linije:
#include
Usput, napominjemo da se funkcija gets često koristi za unos bilo kojeg podatka s tastature kao string u svrhu daljeg pretvaranja funkcije sscanf u željeni format ili za preliminarnu analizu ulaznih podataka, na primjer:
#include
Izlaz linija na standardni izlaz (ekran monitora)
Dvije funkcije se mogu koristiti za izlaz nizova na standardni izlaz (ekran monitora) printf i stavlja... U funkciji printf, "% s" se prosljeđuje kao format. Pogodnost korištenja ove funkcije leži u činjenici da pored stringa možete odmah ispisati podatke drugih vrsta. Feature Feature stavlja leži u činjenici da se nakon izlaza linije automatski događa prijelaz na sljedeći red.
Funkcije za rad sa stringovima
Biblioteka stringova je obezbeđena za pretvaranje stringova u C jeziku. Svaka od funkcija ima svoj format snimanja (prototip).
Najčešće korištene funkcije obrađene su u ovom članku. - čitaj
Primjer programa (listing) koji rade sa stringovima
34--- C # Manual --- Žice
U smislu redovnog programiranja, string string tip podataka je jedan od najvažnijih u C #. Ovaj tip definira i podržava nizove znakova. U brojnim drugim programskim jezicima, string je niz znakova. A u C#, stringovi su objekti. Stoga je tip stringa referentni tip.
Izgradnja struna
Najlakši način da se izgradi niz znakova je korištenje string literala. Na primjer, sljedeći red koda dodjeljuje varijablu string reference str literalnoj referenci niza:
String str = "Uzorak niza";
U ovom slučaju, varijabla str se inicijalizira nizom znakova "Primjer stringa". Također možete kreirati objekat tipa string iz niza tipa char. Na primjer:
Chararray = ("e", "x", "a", "m", "p", "l", "e"); string str = novi string (chararray);
Jednom kada je objekt tipa string kreiran, može se koristiti gdje god je potreban niz citiranog teksta.
String persistence
Začudo, sadržaj objekta tipa string ne može se promijeniti. To znači da se jednom kreirana sekvenca znakova ne može promijeniti. Ali ovo ograničenje doprinosi efikasnijoj implementaciji znakovnih nizova. Stoga se ovaj, na prvi pogled, očigledan nedostatak zapravo pretvara u prednost. Dakle, ako je niz potreban kao varijacija postojećeg stringa, onda u tu svrhu treba kreirati novi string koji sadrži sve potrebne promjene. A pošto se neiskorišteni string objekti automatski sakupljaju kao smeće, ne morate čak ni da brinete o sudbini nepotrebnih nizova.
Treba, međutim, naglasiti da su reference na varijabilne stringove (odnosno objekti tipa string) podložni promjenama, pa se stoga mogu odnositi na drugi objekt. Ali sadržaj samog string objekta se ne mijenja nakon njegovog kreiranja.
Razmotrimo primjer:
Static void addNewString () (string s = "Ovo je moj potez"; s = "Ovo je novi potez";)
Hajde da kompajliramo aplikaciju i učitamo rezultirajući sklop u uslužni program ildasm.exe. Na slici je prikazan CIL kod koji će biti generiran za void addNewString () metodu:
Imajte na umu da postoji više poziva na ldstr (učitavanje linije) opcode. Ovaj CIL ldstr opkod daje upute za učitavanje novog string objekta u upravljanu hrpu. Kao rezultat toga, prethodni objekat koji je sadržavao vrijednost "Ovo je moj udar" će na kraju biti sakupljen.
Rad sa žicama
U razredu System.String obezbeđen je skup metoda za određivanje dužine znakovnih podataka, pronalaženje podniza u trenutnom nizu, pretvaranje znakova iz velikih u mala slova i obrnuto, itd. U nastavku ćemo detaljnije pogledati ovu klasu.
Polje niza, indekser i svojstvo
Klasa String ima jedno definirano polje:
Javni statički string samo za čitanje Empty;
Polje Empty označava prazan niz, tj. string koji ne sadrži znakove. Ovo je u suprotnosti sa praznom string referencom, koja se jednostavno pravi na nepostojeći objekat.
Pored toga, klasa String definira jedan indeksator samo za čitanje:
Javno označi ovo (dobi;)
Ovaj indeksator vam omogućava da dobijete znak na navedenom indeksu. Indeksiranje stringova, kao i nizova, počinje od nule. String objekti su postojani i nepromjenjivi, tako da ima smisla da klasa String podržava indeksator samo za čitanje.
Konačno, String klasa definira jedno svojstvo samo za čitanje:
Javna int dužina (dobi;)
Svojstvo Length vraća broj znakova u nizu. Primjer ispod pokazuje upotrebu indeksera i svojstva Length:
Korišćenje sistema; class Primjer (statički void Main () (string str = "Jednostavan string"; // Dobijte dužinu stringa i 6. znak u nizu pomoću indeksera Console.WriteLine ("Dužina niza je (0),) 6. znak je" (1) "" , str.Dužina, str;))
Operatori string klase
Klasa String preopterećuje sljedeća dva operatora: == i! =. Operator == se koristi za testiranje jednakosti dva niza znakova. Kada se operator == primjenjuje na reference objekata, obično provjerava da li su obje reference napravljene na isti objekt. A kada se operator == primjenjuje na reference na objekte tipa String, tada se sadržaj samih stringova uspoređuje radi jednakosti. Isto vrijedi i za! = Operator. Kada se primeni na reference na objekte tipa String, sadržaj samih nizova se poredi radi nejednakosti. U isto vrijeme, drugi relacijski operatori, uključujući =, uspoređuju reference na objekte tipa String na isti način kao i na objekte drugih tipova. A da biste provjerili je li jedan string veći od drugog, trebali biste pozvati metodu Compare () koja je definirana u klasi String.
Kao što će postati jasno, mnoga poređenja znakovnih nizova koriste kulturne informacije. Ali ovo se ne odnosi na operatore == i!=. Uostalom, oni jednostavno upoređuju redne vrijednosti znakova u nizovima. (Drugim riječima, oni upoređuju vrijednosti binarnih znakova koje nisu kulturno modificirane, tj. kultivirane.) Stoga, ovi operatori izvode poređenja nizova na način bez obzira na velika i mala slova i neosjetljiv na kulturu.
Metode string klase
Sljedeća tabela navodi neke od zanimljivijih metoda ove klase, grupirane po namjeni:
Metoda | Struktura i preopterećenja | Imenovanje |
---|---|---|
Uporedite žice | ||
uporedi () | public static int Compare (string strA, string strB) Public static int Compare (string strA, string strB, bool ignoreCase) Javni statički int Compare (string strA, string strB, StringComparison CompareType) Public static int Compare (string strA, string strB, bool ignoreCase, kultura CultureInfo) |
Statička metoda, upoređuje string strA sa stringom strB. Vraća pozitivnu vrijednost ako je strA veći od strB; negativna vrijednost ako je niz strA manji od niza strB; i nula ako su strA i strB jednaki. Poređenje je osjetljivo na velika i mala slova i kulturološki osjetljivo. Ako je ignoreCase Boolean vrijednost true, poređenje ignorira razliku između velikih i malih slova. Inače, ove razlike se uzimaju u obzir. Parametar CompareType specificira specifičan način za poređenje stringova. Klasa CultureInfo je definirana u imenskom prostoru System.Globalization. |
public static int Compare (string strA, int indexA, string strB, int indexB, int dužina) Public static int Compare (string strA, int indexA, string strB, int indexB, int length, bool ignoreCase) Javni statički int Compare (string strA, int indexA, string strB, int indeksB, int dužina, StringComparison CompareType) Public static int Compare (string strA, int indexA, string strB, int indexB, int length, bool ignoreCase, CultureInfo kultura) |
Uspoređuje dijelove strA i strB stringova. Poređenje počinje sa string elementima strA i strB i uključuje broj znakova specificiranih parametrom dužine. Metoda vraća pozitivnu vrijednost ako je dio strA stringa veći od dijela strB stringa; negativna vrijednost ako je dio niza strA manji od dijela stringa strB; i nula ako su upoređeni dijelovi strA i strB jednaki. Poređenje je osjetljivo na velika i mala slova i kulturološki osjetljivo. |
|
CompareOrdinal () | public static int CompareOrdinal (string strA, string strB) Javni statički int CompareOrdinal (string strA, int indexA, string strB, int indeksB, int count) |
Radi isto što i metoda Compare (), ali zanemaruje lokalne postavke |
uporedi sa () | public int CompareTo (vrijednost objekta) | Uspoređuje pozivni niz sa stringovom reprezentacijom objekta vrijednosti. Vraća pozitivnu vrijednost ako je pozivni niz veći od vrijednosti stringa; negativna vrijednost ako je pozivni niz manji od vrijednosti stringa; i nula ako su upoređeni nizovi jednaki |
public int CompareTo (niz strB) | Upoređuje pozivni niz sa stringom strB |
|
jednako () | javno nadjačavanje bool jednako (object obj) | Vraća Booleovu vrijednost true ako pozivni niz sadrži isti niz znakova kao i reprezentacija stringa za obj. Obavlja poredenje rednog reda osjetljivo na velika i mala slova, ali neosjetljivo na kulturu |
javni bool jednako (vrijednost niza) Javni bool jednako (vrijednost niza, StringComparison ComparisonType) |
Vraća Booleovu vrijednost true ako pozivni niz sadrži isti niz znakova kao i vrijednost stringa. Izvodi se ordinalno poređenje osjetljivo na velika i mala slova, ali neosjetljivo na kulturu. Parametar CompareType definira specifičan način za poređenje stringova |
|
javni statički bool Jednako (niz a, niz b) Javni statički bool Jednako (niz a, string b, StringComparison ComparisonType) |
Vraća logičku vrijednost true ako string a sadrži isti niz znakova kao string b. Izvodi se ordinalno poređenje osjetljivo na velika i mala slova, ali neosjetljivo na kulturu. Parametar CompareType definira specifičan način za poređenje stringova |
|
Spojiti (pridružiti) nizove | ||
concat () | javni statički string Concat (string str0, string str1); javni statički string Concat (vrijednosti niza parametara); |
Kombinira odvojene instance nizova u jedan niz (konkatenacija) |
Traži u nizu | ||
Sadrži () | javni bool Sadrži (vrijednost niza) | Metoda koja vam omogućava da odredite da li niz sadrži određeni podniz (vrijednost) |
Počinje sa () | public bool StartsWith (vrijednost niza) Public bool StartsWith (vrijednost niza, StringComparison ComparisonType) |
Vraća logičku vrijednost true ako pozivni niz počinje vrijednošću podniza. U suprotnom, vraća se Boolean vrijednost false. Parametar CompareType specificira kako se pretraga izvodi. |
Završava sa () | javni bool EndsWith (vrijednost niza) Javni bool EndsWith (vrijednost niza, StringComparison ComparisonType) |
Vraća logičku vrijednost true ako se pozivajući niz završava vrijednošću podniza. U suprotnom, vraća logičku vrijednost false. Parametar CompareType specificira specifičnu metodu pretraživanja |
IndexOf () | public int IndexOf (vrijednost znakova) Public int IndexOf (vrijednost niza) |
Pronalazi prvo pojavljivanje navedenog podniza ili znaka u nizu. Ako željeni znak ili podniz nije pronađen, onda se vraća vrijednost -1 |
public int IndexOf (vrijednost char, int startIndex) Public int IndexOf (vrijednost niza, int startIndex) Javni int IndexOf (vrijednost znakova, int startIndex, int broj) Public int IndexOf (vrijednost niza, int startIndex, int count) |
Vraća indeks prvog pojavljivanja vrijednosti znaka ili podniza u pozivnom nizu. Pretraživanje počinje od elementa u indeksu startIndex i proteže se preko broja elemenata identificiranih brojanjem (ako je naveden). Metoda vraća -1 ako znak za pretragu ili podniz nije pronađen |
|
LastIndexOf () | Preopterećene verzije su slične metodi IndexOf (). | Isto kao IndexOf, ali pronalazi posljednje pojavljivanje znaka ili podniza, a ne prvo |
IndexOfAny () | public int IndexOfAny (char anyOf) Javni int IndexOfAny (char anyOf, int startIndex) Javni int IndexOfAny (char anyOf, int startIndex, int count) |
Vraća indeks prvog pojavljivanja bilo kojeg znaka u nizu anyOf koji se nalazi u pozivnom nizu. Pretraživanje počinje od elementa u indeksu startIndex i proteže se preko broja elemenata identificiranih brojanjem (ako ih ima). Metoda vraća -1 ako nije pronađeno podudaranje ni sa jednim od znakova iz polja anyOf. Pretraga se vrši na redovan način. |
LastIndexOfAny | Preopterećene verzije su slične metodi IndexOfAny (). | Vraća indeks posljednjeg pojavljivanja bilo kojeg znaka iz niza anyOf koji se nalazi u pozivnom nizu |
Razdvajanje i spajanje nizova | ||
Podijeliti | javni string Split (params char separator) Javni string Split (params char separator, int count) |
Metoda koja vraća niz stringova s podstringovima prisutnim u ovoj instanci, odvojenim jedan od drugog elementima iz navedenog niza znakova ili niza nizova. U prvom obliku metode Split (), pozivni niz se dijeli na svoje sastavne dijelove. Kao rezultat, vraća se niz koji sadrži podnizove dobijene iz pozivajućeg niza. Znakovi koji ograničavaju ove podnizove se prosleđuju u nizu separatora. Ako je niz separatora prazan ili se odnosi na prazan niz, tada se kao separator podniza koristi razmak. I u drugom obliku ove metode, vraća se broj podstringova specificiranih parametrom count. |
javni string Split (params char separator, StringSplitOptions opcije) Javni string Split (razdjelnik nizova, opcije StringSplitOptions) Javni string Split (params char separator, int count, StringSplitOptions opcije) Javni string Split (razdjelnik nizova, int count, StringSplitOptions opcije) |
U prva dva oblika metode Split (), pozivni niz se dijeli na dijelove i vraća se niz koji sadrži podnizove dobivene iz pozivajućeg niza. Znakovi koji razdvajaju ove podnizove se prosleđuju u nizu separatora. Ako je niz separatora prazan, tada se kao separator koristi razmak. I u trećem i četvrtom obliku ove metode, vraća se broj redova, ograničen parametrom brojanja. Ali u svim oblicima, parametar opcija označava specifičan način rukovanja praznim redovima koji se generiraju kada su dva graničnika jedan pored drugog. Samo dvije vrijednosti su definirane u nabrajanju StringSplitOptions: Nema i RemoveEmptyEntries... Ako je opcija Ništa, prazni nizovi su uključeni u krajnji rezultat cijepanja originalnog niza. A ako je parametar opcija postavljen na RemoveEmptyEntries, tada se prazni nizovi isključuju iz konačnog rezultata cijepanja originalnog niza. |
|
pridruži se () | javni statički string Join (razdjelnik nizova, vrijednost niza) Javni statički string Join (razdjelnik nizova, vrijednost niza, int startIndex, int count) |
Konstruiše novi string kombinovanjem sadržaja niza nizova. Prvi oblik metode Join () vraća string koji se sastoji od spojenih podnizova proslijeđenih u niz vrijednosti. Drugi oblik također vraća string koji se sastoji od podnizova proslijeđenih u niz vrijednosti, ali oni su spojeni u određenom broju zbrojeva, počevši od elementa niza vrijednosti. U oba oblika, svaki sljedeći red je odvojen od prethodnog reda separatorom specificiranim parametrom separatora. |
Linije za podrezivanje i obrezivanje | ||
Podrezati () | javni niz Trim () Javni string Trim (params char trimChars) |
Metoda koja vam omogućava da uklonite sva pojavljivanja određenog skupa znakova s početka i kraja tekućeg reda. U prvom obliku Trim () metode, vodeći i zadnji razmaci se uklanjaju iz pozivajućeg niza. A drugi oblik ove metode uklanja početna i zadnja pojavljivanja u nizu znakova za pozivanje iz niza trimChars. U oba oblika, rezultujući niz se vraća. |
PadLeft () | javni niz PadLeft (int totalWidth) Javni niz PadLeft (int totalWidth, char paddingChar) |
Omogućava vam da unesete niz znakova s lijeve strane. Prvi oblik metode PadLeft () umeće razmake na lijevoj strani pozivajuće linije tako da je njegova ukupna dužina jednaka vrijednosti parametra totalWidth. I u drugom obliku ove metode, znakovi označeni parametrom paddingChar se ubacuju s lijeve strane pozivajuće linije tako da je njegova ukupna dužina jednaka vrijednosti parametra totalWidth. U oba oblika, rezultujući niz se vraća. Ako je totalWidth manja od dužine pozivajućeg niza, vraća se kopija neizmijenjenog niza poziva. |
PadRight () | Isto kao PadLeft () | Omogućava vam da unesete niz znakova s desne strane. |
Umetanje, brisanje i zamjena nizova | ||
umetnuti () | javni string Insert (int startIndex, vrijednost stringa) | Koristi se za umetanje jednog reda u drugi, pri čemu vrijednost označava red za umetanje u pozivni red na indeksu startIndex. Metoda vraća rezultujući niz. |
Ukloni () | javni niz Ukloni (int startIndex) Javni niz Ukloni (int startIndex, int count) |
Koristi se za uklanjanje dijela niza. U prvom obliku metode Remove (), uklanjanje se izvodi počevši od lokacije označene startIndex i nastavljajući do kraja reda. I u drugom obliku ove metode, broj znakova specificiranih parametrom count se uklanja iz stringa, počevši od pozicije označene startIndex indeksom. |
Zamijeni () | javni niz Zamijeni (char oldChar, char newChar) Javni niz Zamijeni (niz oldValue, string newValue) |
Koristi se za zamjenu dijela niza. U prvom obliku metode Replace (), sva pojavljivanja oldChar u pozivnom nizu se zamjenjuju sa newChar. I u drugom obliku ove metode, sva pojavljivanja stringa oldValue u nizu poziva zamjenjuju se nizom newValue. |
Promjena slučaja | ||
ToUpper () | javni niz ToUpper () | Piše velika slova u nizu poziva. |
Spustiti () | javni niz ToLower () | Mala slova u nizu poziva. |
Dobivanje podniza iz niza | ||
podniz () | javni niz podniz (int startIndex) Javni niz podniz (int startIndex, int dužina) |
U prvom obliku metode Substring (), podniz se preuzima sa pozicije označene parametrom startIndex do kraja pozivajućeg niza. Drugi oblik ove metode izdvaja podniz koji se sastoji od broja znakova specificiranih parametrom dužine, počevši od lokacije označene parametrom startIndex. |
Sljedeći primjer programa koristi nekoliko od gore navedenih metoda:
Korišćenje sistema; koristeći System.Collections.Generic; koristeći System.Linq; koristeći System.Text; imenski prostor ConsoleApplication1 (klasa Program (statički void Main (string args) (// Uporedite prva dva reda string s1 = "ovo je string"; string s2 = "ovo je tekst, a ovo je string"); if (String. CompareOrdinal (s1, s2) ! = 0) Console.WriteLine ("Strings s1 i s2 nisu jednaki"); if (String.Compare (s1, 0, s2, 13, 10, true) == 0) Console.WriteLine ("Istovremeno, imaju isti tekst "); // Konkatenacija nizova Console.WriteLine (String.Concat (" \ n "+" Jedan, dva "," tri, četiri ")); // Traži u string // Prvo pojavljivanje podniza if (s2. IndexOf ("ovo")! = -1) Console.WriteLine ("Riječ \" this \ "nađena je u redu, nalazi se" + "na: (0 ) position", s2.IndexOf ("this")); / / Posljednje pojavljivanje podniza if (s2.LastIndexOf ("this")! = -1) Console.WriteLine ("Posljednje pojavljivanje riječi \" this \ "je" + "na (0) poziciji", s2.LastIndexOf ("ovo" )); // Traži iz niza znakova char myCh = ("Y", "x", "t"); if ( s2.IndexOfAny (myCh)! = -1) Console.WriteLine ("Jedan od znakova iz niza ch "+" pronađen u trenutnom linija na poziciji (0) ", s2.IndexOfAny (myCh)); // Određuje da li string počinje datim podnizom if (s2.StartsWith ("ovo je tekst") == true) Console.WriteLine ("Podniz pronađen!"); // Odredite da li niz sadrži podniz // koristeći primjer definiranja korisničkog OS stringa myOS = Environment.OSVersion.ToString (); if (myOS.Sadrži ("NT 5.1")) Console.WriteLine ("Vaš operativni sistem je Windows XP"); else if (myOS.Sadrži ("NT 6.1")) Console.WriteLine ("Vaš Windows 7 operativni sistem"); Console.ReadLine (); )))
Malo o poređenju stringova u C #
Od svih operacija obrade niza znakova, vjerovatno je da se jedan niz uspoređuje s drugim. Prije razmatranja bilo kakvih metoda za poređenje stringova, treba naglasiti sljedeće: poređenja nizova se mogu izvesti u .NET Frameworku na dva glavna načina:
Prvo, poređenje može odražavati običaje i norme određenog kulturnog okruženja, koje su često kulturne postavke koje stupaju na snagu kada se program pokrene. Ovo je standardno ponašanje za neke, ali ne sve metode poređenja.
I drugo, poređenje se može izvesti bez obzira na postavke kulturnog okruženja samo po rednim vrijednostima znakova koji čine niz. Uopšteno govoreći, kulturološki zanemarena poređenja nizova koriste leksikografski red (i lingvistička razmatranja) kako bi odredili da li je jedan niz veći, manji ili jednak drugom nizu. U ordinalnom poređenju, nizovi se jednostavno poredaju na osnovu nepromenjene vrednosti svakog znaka.
Zbog različitih kulturoloških i ordinalnih poređenja nizova i implikacija svakog poređenja, toplo se preporučuje da slijedite najbolje prakse koje trenutno nudi Microsoft. Uostalom, odabir pogrešnog načina za upoređivanje stringova može dovesti do pogrešnog rada programa kada se koristi u okruženju koje se razlikuje od onog u kojem je razvijen.
Izbor načina upoređivanja znakovnih nizova je vrlo važna odluka. Kao opšte pravilo i bez izuzetka, kulturološki prikladno poređenje nizova treba izabrati ako je u svrhu prikazivanja rezultata korisniku (na primer, za prikaz niza nizova sortiranih po leksikografskom redosledu). Međutim, ako stringovi sadrže fiksne informacije koje nisu namijenjene za modificiranje kako bi se prilagodile kulturološkim razlikama, kao što su naziv datoteke, ključna riječ, adresa web stranice ili sigurnosna vrijednost, tada biste trebali odabrati poređenje rednih nizova. Naravno, specifičnosti određene aplikacije koja se razvija će diktirati izbor odgovarajućeg načina za poređenje nizova znakova.
Klasa String pruža razne metode poređenja stringova, koje su navedene u gornjoj tabeli. Najsvestraniji od njih je Compare () metoda. Omogućava vam da uporedite dva niza u cjelini ili djelomično, osjetljivo na velika ili mala slova, način poređenja definiran parametrom tipa StringComparison kao i informacije o kulturi koje se pružaju s parametrom tipa CultureInfo.
Preopterećene varijante Compare () koje ne sadrže parametar tipa StringComparison izvode poređenje znakovnih nizova osjetljivo na velika i mala slova i kulturu. A u onim preopterećenim varijantama koje ne sadrže parametar tipa CultureInfo, informacije o kulturi određuju se trenutnim vremenom izvođenja.
Tip StringComparison je enumeracija koja definira vrijednosti prikazane u tabeli ispod. Koristeći ove vrijednosti, možete organizirati poređenja nizova tako da odgovaraju potrebama vaše određene aplikacije. Stoga dodavanje parametra tipa StringComparison proširuje metodu Compare () i druge metode poređenja kao što je Equals (). Takođe omogućava da se nedvosmisleno naznači kako se nizovi trebaju porediti.
Zbog razlika između poređenja nizova osjetljivih na kulturu i poređenja rednih brojeva, vrlo je važno biti što precizniji u ovom pogledu.
Značenje | Opis |
---|---|
CurrentCulture | Poređenja nizova se vrše korištenjem trenutnih postavki kulture |
CurrentCultureIgnoreCase | Poređenja nizova se vrše korištenjem trenutnih postavki kulture, ali ne razlikuju velika i mala slova |
InvariantCulture | Poređenje stringova se vrši korišćenjem immutable, tj. univerzalni podaci o kulturnom okruženju |
InvariantCultureIgnoreCase | Poređenje stringova se vrši korišćenjem immutable, tj. univerzalni podaci o kulturnom okruženju i neosjetljivi na velika i mala slova |
Redni | Poređenja nizova se vrše korištenjem rednih vrijednosti znakova u nizu. U tom slučaju leksikografski poredak može biti narušen, a konvencije usvojene u posebnom kulturnom okruženju se zanemaruju. |
OrdinalIgnoreCase | Poređenje nizova se vrši korištenjem rednih vrijednosti znakova u nizu, ali ne razlikuje velika i mala slova |
U oba slučaja, Compare () metoda vraća negativnu vrijednost ako je prvi niz koji se poredi manji od drugog; pozitivna vrijednost ako je prvi upoređeni niz veći od drugog; i konačno nula ako su oba niza koja se upoređuju jednaka. Iako metoda Compare () vraća nulu ako su stringovi koji se uspoređuju jednaki, općenito je najbolje koristiti metodu Equals () ili == operator da odredite jesu li nizovi znakova jednaki.
Poenta je da metoda Compare () određuje jednakost upoređenih nizova na osnovu njihovog redoslijeda sortiranja. Na primjer, ako uspoređujete nizove na način koji je osjetljiv na kulturu, tada oba niza mogu biti ista po redoslijedu sortiranja, ali ne i suštinski jednaka. Prema zadanim postavkama, jednakost nizova se određuje u metodi Equals () na temelju rednih znakovnih vrijednosti i kulturno je neosjetljiva. Prema tome, prema zadanim postavkama, oba niza se porede u ovoj metodi za apsolutnu jednakost karakter po znak, slično kao što se radi u == operatoru.
Iako je metoda Compare () svestranija, lakše je koristiti metodu CompareOrdinal () za jednostavna poređenja nizova znakova. Konačno, imajte na umu da metoda CompareTo () uspoređuje samo nizove u smislu kulture.
Program ispod pokazuje upotrebu metoda Compare (), Equals (), CompareOrdinal () i operatora == i! = za poređenje znakovnih nizova. Imajte na umu da prva dva primjera poređenja ilustriraju razliku između kulturološki osjetljivih poređenja nizova i poređenja redova na engleskom:
Korišćenje sistema; Primjer klase (statički void Main () (string str1 = "alpha"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alpha"; string str5 = "alpha, beta"; int rezultat; / / Prvo, pokažite razliku između poređenja stringova svjesnih kulture i rezultata poređenja redova = String.Compare (str1, str2, StringComparison.CurrentCulture); Console.Write ("Poređenje stringova svjesnih kulture:"); if (rezultat 0 ) Konzola .WriteLine (str1 + "veće od" + str2); inače Console.WriteLine (str1 + "jednako" + str2); rezultat = String.Compare (str1, str2, StringComparison.Ordinal); Console.Write ("Ordinalno poređenje linije: "); if (rezultat 0) Console.WriteLine (str1 +" veći od "+ str2); else Console.WriteLine (str1 +" jednako "+ str4); // Koristite CompareOrdinal () metodu rezultat = String .CompareOrdinal ( str1, str2); Console.Write ("Uporedi stringove koristeći CompareOrdinal () metod: \ n"); if (rezultat 0) Console.WriteLine (str1 + "više" + str2); inače Console.WriteLine ( str 1 + "jednako" + str4); Console.WriteLine (); // Odredite jednakost nizova pomoću == operatora // Ovo je ordinalno poređenje nizova znakova if (str1 == str4) Console.WriteLine (str1 + "==" + str4); // Odredite nejednakost niza pomoću operatora! = If (str1! = Str3) Console.WriteLine (str1 + "! =" + Str3); if (str1! = str2) Console.WriteLine (str1 + "! =" + str2); Console.WriteLine (); // Izvrši rednu usporedbu nizova bez obzira na velika i mala slova // koristeći metodu Equals () if (String.Equals (str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine ("Uspoređivanje nizova pomoću metode Equals () sa" + "Parametar OrdinalIgnoreCase: \ n "+ str1 +" je jednako "+ str2); Console.WriteLine (); // Usporedi dijelove nizova if (String.Compare (str2, 0, str5, 0, 3, StringComparison.CurrentCulture)> 0) (Console.WriteLine ("Uporedi nizove na osnovu trenutne kulture:" + "\ n3 prva znaka reda "+ str2 +" je veći od prva 3 znaka niza "+ str5);)))
Izvođenje ovog programa daje sljedeći rezultat:
Moderni C++ standard definira klasu sa funkcijama i svojstvima (varijable) za organiziranje rada sa stringovima (u klasičnom jeziku C nema nizova kao takvih, postoje samo nizovi znakova):
#include
#include#include
Da biste radili sa stringovima, također morate povezati standardni imenski prostor:
Using namespace std;
U suprotnom, morat ćete svuda navesti deskriptor klase std :: string umjesto stringa.
Ispod je primjer programa koji radi sa stringom (ne radi u starim C-kompatibilnim kompajlerima!):
#include
Glavne karakteristike string klase:
- inicijalizacija nizom znakova (niz ugrađenog tipa) ili drugim objektom tipa string. Ugrađeni tip nema drugu opciju;
- kopiranje jednog reda u drugi. Za ugrađeni tip, morate koristiti funkciju strcpy ();
- pristup pojedinačnim znakovima niza za čitanje i pisanje. U ugrađenom nizu, ovo se radi pomoću operacije preuzimanja indeksa ili indirektnog adresiranja pomoću pokazivača;
- poređenje dva niza za jednakost. Za ugrađeni tip koriste se funkcije porodice strcmp ();
- konkatenacija (konkatenacija) dva niza, dajući rezultat ili kao treći niz, ili umjesto jednog od originalnih. Za ugrađeni tip koristi se funkcija strcat (), ali da biste dobili rezultat u novom redu, morate uzastopno koristiti funkcije strcpy () i strcat (), a također voditi računa o dodjeli memorije;
- ugrađena sredstva za određivanje dužine stringa (članske funkcije veličine klase () i dužine ()). Dužinu niza ugrađenog tipa možete saznati samo izračunavanjem pomoću funkcije strlen ();
- mogućnost saznanja da li je niz prazan.
Pogledajmo bliže ove osnovne karakteristike.
Inicijalizacija nizova prilikom opisivanja i dužina linije(ne uključujući završni null terminator):
String st ("Moj string \ n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";
Niz se može dati i prazan:
String st2;
Da proverim da li je linija prazna, možete uporediti njegovu dužinu sa 0:
If (! St.size ()) // prazno
ili koristite metodu empty (), vraćajući true za prazan niz i false za neprazan niz:
If (st.empty ()) // prazno
Treći oblik kreiranja niza inicijalizira objekt tipa string drugim objektom istog tipa:
String st3 (st);
String st3 je inicijaliziran stringom st. Kako možemo biti sigurni da su ovi žice odgovaraju? Koristimo operator poređenja (==):
If (st == st3) // inicijalizacija je uspjela
Kako kopirati jedan red u drugi? Uz uobičajenu operaciju dodjele:
St2 = st3; // kopiraj st3 u st2
Za konkatenacija nizova koristite operaciju sabiranja (+) ili operaciju sabiranja (+ =). Neka su data dva reda:
String s1 ("zdravo,"); string s2 ("svijet \ n");
Možemo dobiti treći red, koji se sastoji od spajanja prva dva, ovako:
String s3 = s1 + s2;
Ako želimo dodati s2 na kraj s1, moramo napisati:
S1 + = s2;
Operacija sabiranja može spojiti objekte klase string ne samo među sobom, već i sa nizovima ugrađenog tipa. Gornji primjer možete prepisati tako da posebni znakovi i interpunkcijski znaci budu predstavljeni ugrađenim tipom char *, a značajne riječi su predstavljene nizom objekata:
Const char * pc = ","; string s1 ("zdravo"); string s2 ("svijet"); string s3 = s1 + pc + s2 + "\ n"; cout<< endl << s3;
Izrazi poput ovih rade jer kompajler "zna" kako automatski pretvoriti objekte ugrađenog tipa u objekte string klase. Moguće je i jednostavno dodjeljivanje umetnutog niza objektu niza:
String s1; const char * pc = "niz znakova"; s1 = pc; // desno
U ovom slučaju, inverzna transformacija ne radi... Pokušaj da se izvrši sljedeća inicijalizacija niza ugrađenog tipa će izazvati grešku kompilacije:
Char * str = s1; // greška kompilacije
Da biste izvršili ovu konverziju, morate eksplicitno pozvati funkciju člana c_str () ("C string"):
Const char * str = s1.c_str ();
Funkcija c_str () vraća pokazivač na niz znakova koji sadrži string objekta string kao što bi bio u ugrađenom tipu stringa. Ključna riječ const ovdje sprječava "opasnu" u modernim vizualnim okruženjima mogućnost direktnog mijenjanja sadržaja objekta putem pokazivača.
TO pojedinačni likovi objektu tipa string, poput ugrađenog tipa, može se pristupiti korištenjem operacije preuzimanja indeksa. Na primjer, evo isječka koda koji zamjenjuje sve tačke podvlakama:
String str ("www.disney.com"); int size = str.size (); za (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;
Zamijenite (str.begin (), str.end (), ".", "_");
Istina, ovdje se ne koristi metoda zamjene string klase, već istoimeni algoritam:
#include
Budući da se string objekat ponaša kao kontejner, na njega se mogu primijeniti drugi algoritmi. Ovo vam omogućava da riješite probleme koji nisu direktno riješeni funkcijama string klase.
Ispod je kratak opis glavnih operatora i funkcija string klase, veze u tabeli vode do opisa na ruskom jeziku na Internetu. Za potpuniju listu mogućnosti string klase, pogledajte, na primjer, Wikipedia ili cplusplus.com.