Deklariranje nizova
Niz u C-u je jednodimenzionalni niz znakova. posljednji elementšto je znak za kraj retka - nula (niz koji završava nulom, odnosno NULL završeni niz).
Obavijest varijabilni tip niz u C-u moguć je na tri načina, od kojih dva inicijaliziraju niz u trenutku deklaracije.
Prvi način:
Deklaracije nizova znakova (ne zaboravite dodati prostor za završetak nule):
Char s;
Drugi način:
Dodijeli varijabli niza početna vrijednost(u ovom slučaju, kompajler može sam izračunati duljinu niza):
Char s = "Primjer inicijalizacije niza";
Desno od znaka dodjele je konstanta niza. Nula ('\0') se automatski dodaje na kraj retka. Konstante niza znakova smještene su u statičku memorijsku klasu.
Treći način:
Implicitna indikacija da se niz koristi. Lijevo od znaka dodjele nalazi se pokazivač na simbol:
Char *s="Druga opcija inicijalizacije";
Varijabla s bit će pokazivač na tu lokaciju u RAM memorija, gdje se nalazi konstanta niza. U ovom obliku snimanja laži potencijalna greška, što znači da se pokazivač na znak često naziva niz. Unos u nastavku je samo pokazivač na znak, budući da nema predviđenog prostora za niz:
Char *s;
Unos niza sa standardnog uređaja za unos (tipkovnica)
Postoji skup funkcija za rad sa nizovima. Za unos sa standardnog ulaznog uređaja (tipkovnice) najčešće se koriste funkcije knjižnice iz standardnog ulazno/izlaznog modula: skenirati I dobiva.
Za unos niza pomoću funkcije skenirati, koristi format « %s» , i imajte na umu da se znak adrese ne koristi prije identifikatora retka « & » , budući da je jednodimenzionalni niz već predstavljen pokazivačem na njegov početak:
Scanf("%s", s);
Funkcija dobiva()čita znakove dok ne dođe do znaka novog retka. Funkcija prihvaća sve znakove do znaka novog retka, ali ga ne uključuje. Završna nula ('\0') dodaje se na kraj retka. Funkcija dobiva() postavlja niz znakova pročitanih s tipkovnice u parametar tipa string i vraća pokazivač na taj niz (ako je operacija bila uspješna), ili NULL (u slučaju greške). U donjem primjeru, ako se operacija uspješno završi, dva identične linije:
#uključi
Usput, napomenimo da se gets funkcija često koristi za unos bilo kojeg podatka s tipkovnice kao niza u svrhu daljnje konverzije sscanf funkcijom u željeni format ili za preliminarnu analizu ulaznih podataka, na primjer:
#uključi
Ispis nizova na standardni izlaz (zaslon monitora)
Za izlaz nizova u standardni uređaj izlaz (zaslon monitora) mogu se koristiti dvije funkcije printf I stavlja. U printf funkcije"%s" se prosljeđuje kao format. Pogodnost korištenja ove funkcije je u tome što osim niza, možete odmah prikazati podatke drugih vrsta. Značajka Značajka stavlja je da se nakon ispisivanja retka automatski prelazi na sljedeći redak.
Funkcije za rad sa stringovima
Za pretvorbu nizova u jeziku C dostupna je biblioteka nizova. Svaka funkcija ima vlastiti format snimanja (prototip).
U ovom se članku raspravlja o najčešće korištenim funkcijama. - čitati
Primjer programa (listing) koji rade sa stringovima
34--- Vodič za C# --- Žice
Sa stajališta uobičajenog programiranja, niz vrsta podataka string jedan je od najvažnijih u C#. Ovaj tip definira i podržava znakovne nizove. U brojnim drugim programskim jezicima, niz je niz znakova. A u C#, nizovi su objekti. Stoga je tip niza referentni tip.
Izgradnja nizova
Najjednostavniji način konstruiranja znakovnog niza je korištenje string literala. Na primjer, u sljedeći redak koda, varijabli reference niza str dodjeljuje se referenca na literal niza:
String str = "Primjer niza";
U u ovom slučaju varijabla str se inicijalizira nizom znakova "Primjerni niz". Objekt tipa string također se može stvoriti iz niza tipa char. Na primjer:
Chararray = ("e", "x", "a", "m", "p", "l", "e"); string str = novi niz(chararray);
Nakon što se objekt niza stvori, može se koristiti bilo gdje gdje trebate niz teksta unutar navodnika.
Postojanost niza
Čudno je da se sadržaj objekta tipa string ne može promijeniti. To znači da jednom kreiran niz znakova ne može se mijenjati. Ali ovo ograničenje doprinosi učinkovitijoj implementaciji nizova znakova. Stoga se ovaj naizgled očiti nedostatak zapravo pretvara u prednost. Stoga, ako je niz potreban kao varijacija postojećeg niza, tada bi se u tu svrhu trebao stvoriti novi niz koji sadrži sve potrebne promjene. A budući da se neiskorišteni string objekti automatski skupljaju kao smeće, ne morate čak ni brinuti o sudbini nepotrebnih stringova.
Međutim, treba naglasiti da su varijabilne reference na stringove (odnosno objekte tipa string) podložne promjenama, te se stoga mogu odnositi na drugi objekt. Ali sadržaj samog string objekta ne mijenja se nakon što je kreiran.
Pogledajmo primjer:
Static void addNewString() ( string s = "Ovo je moj potez"; s = "Ovo je novi potez"; )
Prevedimo aplikaciju i učitajmo rezultirajući sklop u uslužni program ildasm.exe. Slika prikazuje CIL kod koji će se generirati za metodu void addNewString():
Imajte na umu da postoje brojni pozivi operacijskom kodu ldstr (string load). Ovaj opcijski kod CIL ldstr izvodi učitavanje novog objekta niza na upravljanu gomilu. Kao rezultat toga, prethodni objekt koji je sadržavao vrijednost "Ovo je moj udar" na kraju će biti skupljen u smeće.
Rad sa nizovima
U klasi System.String postoji niz metoda za određivanje duljine znakovnih podataka, traženje podniza u trenutna linija, pretvaranje znakova iz velikih u mala slova i obrnuto itd. Zatim ćemo detaljnije pogledati ovu klasu.
Svojstvo klase polja, indeksatora i niza
U klasa String definirano je jedno polje:
Javni statički niz samo za čitanje Prazan;
Prazno polje označava prazan niz, tj. niz koji ne sadrži nijedan znak. Ovo se razlikuje od prazne reference niza, koja se jednostavno postavlja na nepostojeći objekt.
Osim toga, klasa String definira jedan indekser samo za čitanje:
Javno označi ovo ( get; )
Ovaj indeksator vam omogućuje da dobijete znak na određenom indeksu. Indeksiranje nizova, kao i nizova, počinje od nule. String objekti su postojani i ne mijenjaju se, tako da ima smisla da klasa String podržava indeksiranje samo za čitanje.
Konačno, klasa String definira jedno svojstvo samo za čitanje:
Public int duljina ( get; )
Svojstvo Length vraća broj znakova u nizu. Primjer u nastavku prikazuje upotrebu indeksatora i svojstva Length:
Korištenje sustava; Primjer klase ( static void Main() ( string str = " Jednostavan niz"; // Dobijte duljinu retka i 6. znak u retku pomoću indeksatora Console.WriteLine("Duljina retka - (0), 6. znak - "(1)"", str.Length, str) ;))
Operatori klase nizova
Klasa String preopterećuje sljedeća dva operatora: == i !=. Operator == koristi se za testiranje jednakosti dva niza znakova. Kada se operator == primijeni na reference objekta, on obično testira jesu li obje reference napravljene na isti objekt. A kada se operator == primijeni na reference na objekte tipa String, sadržaj samih nizova se uspoređuje radi jednakosti. Isto vrijedi i za operator !=. Kada se primjenjuje na reference na objekte tipa String, sadržaj samih nizova uspoređuje se radi nejednakosti. Međutim, drugi relacijski operatori, uključujući =, uspoređuju reference na objekte tipa String na isti način kao što uspoređuju reference na objekte drugih tipova. A da biste provjerili je li jedan niz veći od drugog, trebali biste pozvati metodu Compare() definiranu u klasi String.
Kao što će postati jasno, mnoge vrste usporedbi nizova znakova oslanjaju se na kulturološke informacije. Ali to se ne odnosi na operatore == i !=. Uostalom, oni jednostavno uspoređuju redne vrijednosti znakova u nizovima. (Drugim riječima, oni uspoređuju binarne vrijednosti znakova koji nisu izmijenjeni kulturnim normama, to jest lokalnim standardima.) Stoga ovi operatori izvode usporedbe nizova na način koji ne razlikuje velika i mala slova i kulturu.
Metode klasa nizova
Sljedeća tablica navodi neke od najzanimljivijih metoda u ovoj klasi, grupirane prema namjeni:
metoda | Struktura i preopterećenja | Svrha |
---|---|---|
Usporedba nizova | ||
usporedi() | public static int Usporedi(niz strA, niz strB) Public static int Compare(string strA, string strB, bool ignoreCase) Public static int Compare(string strA, string strB, StringComparison usporedbaType) Public static int Compare(string strA, string strB, bool ignoreCase, CultureInfo kultura) |
Statička metoda uspoređuje niz strA sa nizom strB. Vraća pozitivnu vrijednost ako niz strA više linija strB; negativno značenje, ako je niz strA manji od niza strB; a nula ako su nizovi strA i strB jednaki. Usporedbe se rade na temelju registra i kulture. Ako ignoreCase dobije vrijednost true, usporedba ne uzima u obzir razlike između velikih i malih slova. Inače, ove razlike se uzimaju u obzir. CompareType parametar specificira određeni način na koji se nizovi uspoređuju. Klasa CultureInfo definirana je u prostoru imena System.Globalization. |
public static int Compare(string strA, int indexA, string strB, int indexB, int length) Public static int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase) Public static int Compare(string strA, int indexA, string strB, int indexB, int length, StringComparison usporedbaType) Public static int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase, CultureInfo kultura) |
Uspoređuje dijelove stringova strA i strB. Usporedba počinje s elementima niza strA i strB i uključuje broj znakova specificiranih parametrom duljine. Metoda vraća pozitivnu vrijednost ako je dio niza strA veći od dijela niza strB; negativna vrijednost ako je dio niza strA manji od dijela niza strB; i nula ako su dijelovi nizova strA i strB koji se uspoređuju jednaki. Usporedbe se rade na temelju registra i kulture. |
|
Usporedi Redni() | public static int CompareOrdinal(string strA, string strB) Public static int CompareOrdinal(string strA, int indexA, string strB, int indexB, int count) |
Radi isto što i metoda Compare(), ali bez uzimanja u obzir lokalnih postavki |
Usporedi s() | public int CompareTo(vrijednost objekta) | Uspoređuje pozivni niz s prikazom niza vrijednosnog objekta. Vraća pozitivnu vrijednost ako je pozivni niz veći od vrijednosti; negativno ako je pozivni niz manji od vrijednosti; i nula ako su uspoređeni nizovi jednaki |
public int CompareTo(string strB) | Uspoređuje pozivni niz s nizom strB |
|
Jednako() | javno nadjačavanje bool jednako(objekt obj) | Vraća booleovu vrijednost true ako pozivni niz sadrži isti niz znakova kao niz znakova obj. Obavlja rednu usporedbu koja razlikuje velika i mala slova, ali kulturološki neosjetljiva |
public bool jednako (vrijednost niza) Public bool Equals(string value, StringComparison usporedbaType) |
Vraća booleovu vrijednost true ako pozivni niz sadrži isti niz znakova kao vrijednost niza. Izvodi se redna usporedba koja razlikuje velika i mala slova, ali nije osjetljiva na kulturu. CompareType parametar specificira određeni način na koji se nizovi uspoređuju |
|
public static bool Equals(string a, string b) Javni statički bool Jednako (string a, string b, StringComparison usporedbaType) |
Vraća booleovu vrijednost true ako niz a sadrži isti niz znakova kao niz b. Izvodi se redna usporedba koja razlikuje velika i mala slova, ali nije osjetljiva na kulturu. CompareType parametar specificira određeni način na koji se nizovi uspoređuju |
|
Ulančavanje (povezivanje) nizova | ||
Concat() | javni statički niz Concat(niz str0, niz str1); public static string Concat(params string values); |
Kombinira pojedinačne instance niza u jedan niz (ulančavanje) |
Traži u nizu | ||
Sadrži () | javni bool Sadrži (vrijednost niza) | Metoda koja vam omogućuje da odredite sadrži li niz određeni podniz (vrijednost) |
Počinje sa() | public bool StartsWith(vrijednost niza) Javni bool StartsWith(string vrijednost, StringComparison usporedbaType) |
Vraća booleovu vrijednost true ako pozivni niz počinje vrijednošću podniza. Inače se vraća booleova vrijednost false. CompareType parametar specificira određeni način izvođenja pretraživanja |
Završava s() | public bool EndsWith(vrijednost niza) Public bool EndsWith(string value, StringComparison usporedbaType) |
Vraća booleovu vrijednost true ako pozivni niz završava vrijednošću podniza. U suprotnom, vraća booleovu vrijednost false. CompareType parametar specificira specifičnu metodu pretraživanja |
IndexOf() | public int IndexOf(char vrijednost) Javni int IndexOf(vrijednost niza) |
Pronalazi prvo pojavljivanje zadanog podniza ili znaka u nizu. Ako traženi znak ili podniz nije pronađen, vraća se vrijednost -1. |
public int IndexOf(char vrijednost, int startIndex) Public int IndexOf(vrijednost niza, int startIndex) Public int IndexOf(char value, int startIndex, int count) Public int IndexOf(string value, int startIndex, int count) |
Vraća indeks prvog pojavljivanja vrijednosti znaka ili podniza u pozivnom nizu. Pretraživanje počinje od elementa navedenog pomoću startIndex i obuhvaća broj elemenata navedenih pomoću count (ako je navedeno). Metoda vraća -1 ako traženi znak ili podniz nije pronađen |
|
LastIndexOf() | Preopterećene verzije slične su metodi IndexOf(). | Isto kao IndexOf, ali pronalazi zadnje pojavljivanje znaka ili podniza, a ne prvo |
IndexOfAny() | public int IndexOfAny(char anyOf) Public int IndexOfAny(char anyOf, int startIndex) Public int IndexOfAny(char anyOf, int startIndex, int count) |
Vraća indeks prvog pojavljivanja bilo kojeg znaka iz polja anyOf pronađenog u pozivnom nizu. Pretraživanje počinje od elementa navedenog pomoću startIndex i obuhvaća broj elemenata navedenih pomoću count (ako je navedeno). Metoda vraća -1 ako se ne podudara niti jedan znak u nizu anyOf. Pretraga se obavlja na ordinalan način |
LastIndexOfAny | Preopterećene verzije slične su metodi IndexOfAny(). | Vraća indeks posljednjeg pojavljivanja bilo kojeg znaka iz polja anyOf pronađenog u pozivnom nizu |
Rastavljanje i spajanje nizova | ||
Podjela | javni niz Split (razdjelnik znakova parametara) Javni niz Split (params char separator, int count) |
Metoda koja vraća niz nizova s podnizovima prisutnim u ovoj instanci unutar, koji su međusobno odvojeni elementima iz navedenog niza znakova ili nizova. Prvi oblik metode Split() dijeli pozivni niz na sastavne dijelove. Rezultat je niz koji sadrži podnizove dobivene iz pozivnog niza. Znakovi koji ograničavaju ove podnizove prosljeđuju se u nizu razdjelnika. Ako je niz razdjelnika prazan ili se odnosi na prazan niz, tada se kao razdjelnik podniza koristi razmak. I u drugom obliku ovu metodu vraća broj podnizova specificiranih parametrom count. |
public string Split(params separator znakova, StringSplitOptions opcije) Javno dijeljenje niza (razdjelnik nizova, opcije StringSplitOptions) Javno razdvajanje niza (razdjelnik znakova parametara, int broj, opcije StringSplitOptions) Javni string Split (string separator, 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 pozivnog niza. Znakovi koji odvajaju ove podnizove prosljeđuju se u nizu razdjelnika. Ako je niz razdjelnika prazan, razmak se koristi kao razdjelnik. A u trećem i četvrtom obliku ove metode vraća se broj redaka ograničen parametrom brojanja. Ali u svim oblicima, parametar opcija navodi određeni način za rukovanje praznim redcima koji nastaju kada su dva graničnika susjedna. Nabrajanje StringSplitOptions definira samo dvije vrijednosti: Nijedan I RemoveEmptyEntries. Ako je opcija None, tada su prazni nizovi uključeni u konačni rezultat dijeljenja izvornog niza. A ako je parametar opcija postavljen na RemoveEmptyEntries, onda su prazni redovi isključeni iz konačnog rezultata dijeljenja izvornog niza. |
|
Pridružiti() | public static string Join(string separator, string value) Javni statički niz Join(razdjelnik niza, vrijednost niza, int startIndex, int count) |
Konstruira novi niz kombiniranjem sadržaja niza nizova. Prvi oblik metode Join() vraća niz koji se sastoji od spojenih podnizova proslijeđenih u nizu vrijednosti. Drugi oblik također vraća niz koji se sastoji od podnizova proslijeđenih u nizu vrijednosti, ali oni su spojeni u određeni broj, počevši od elementa niza vrijednosti. U oba oblika, svaki sljedeći redak odvojen je od prethodnog retka razdjelnom linijom određenom parametrom separator. |
Linije za punjenje i obrezivanje | ||
Trim() | javni niz Trim() Javni niz Trim(params char trimChars) |
Metoda koja vam omogućuje uklanjanje svih pojavljivanja određenog skupa znakova s početka i kraja tekućeg retka. Prvi oblik metode Trim() uklanja razmake na početku i na kraju iz pozivnog niza. A drugi oblik ove metode uklanja početak i kraj pojavljivanja pozivnog niza znakova iz niza trimChars. Oba oblika vraćaju rezultirajući niz. |
PadLeft() | javni niz PadLeft(int totalWidth) Javni niz PadLeft(int totalWidth, char paddingChar) |
Omogućuje dodavanje niza znakovima s lijeve strane. Prvi oblik metode PadLeft() uvodi razmake na lijevoj strani pozivnog niza tako da njegova ukupna duljina postaje jednaka vrijednosti parametra totalWidth. A u drugom obliku ove metode, znakovi označeni parametrom paddingChar unose se s lijeve strane pozivnog niza tako da njegova ukupna duljina postaje jednaka vrijednosti parametra totalWidth. Oba oblika vraćaju rezultirajući niz. Ako je vrijednost parametra totalWidth manja od duljine pozivnog niza, tada se vraća kopija nepromijenjenog pozivnog niza. |
PadRight() | Isto kao PadLeft() | Omogućuje vam dodavanje niza sa znakovima s desne strane. |
Umetanje, brisanje i zamjena redaka | ||
Umetnuti() | public string Insert(int startIndex, string value) | Koristi se za umetanje jednog retka u drugi, gdje vrijednost označava red koji treba umetnuti u pozivni redak na startIndex. Metoda vraća rezultirajući niz. |
Ukloniti() | javni niz Remove(int startIndex) Javni niz Remove(int startIndex, int count) |
Koristi se za uklanjanje dijela niza. U prvom obliku metode Remove(), uklanjanje počinje na mjestu označenom s startIndex i nastavlja se do kraja retka. A u drugom obliku ove metode, broj znakova određen parametrom count uklanja se iz niza, počevši od mjesta naznačenog indeksom startIndex. |
Zamijeniti() | javni niz Zamijeni(char oldChar, char newChar) Javni niz Zamijeni (niz staraVrijednost, niz novaVrijednost) |
Koristi se za zamjenu dijela niza. U prvom obliku metode Replace(), sva pojavljivanja znaka oldChar u pozivnom nizu zamjenjuju se znakom newChar. A u drugom obliku ove metode, sva pojavljivanja niza oldValue u retku poziva zamjenjuju se nizom newValue. |
Promjena velikih i malih slova | ||
ToGore() | javni niz ToUpper() | Pravi velika slova u pozivnom nizu. |
Spustiti() | javni niz ToLower() | Mala slova u pozivnom nizu. |
Dobivanje podniza iz niza | ||
podniz() | javni niz Substring(int startIndex) Javni niz Podniz (int startIndex, int duljina) |
U prvom obliku metode Substring(), podniz se dohvaća počevši od lokacije označene parametrom startIndex i završavajući na kraju pozivnog niza. A u drugom obliku ove metode izdvaja se podniz koji se sastoji od broja znakova određenog parametrom duljine, počevši od mjesta naznačenog parametrom startIndex. |
Sljedeći primjer programa koristi nekoliko gore navedenih metoda:
Korištenje sustava; koristeći System.Collections.Generic; koristeći System.Linq; koristeći System.Text; namespace ConsoleApplication1 ( class Program ( static void Main(string args) ( // Usporedite prva dva retka string s1 = "ovo je niz"; niz s2 = "ovo je tekst, a ovo je niz"; if (String. CompareOrdinal(s1, s2) != 0) Console.WriteLine("Nizovi s1 i s2 nisu jednaki"); if (String.Compare(s1, 0, s2, 13, 10, true) == 0) Console.WriteLine ("Međutim, sadrže isti tekst"); // Ulančavanje nizova Console.WriteLine(String.Concat("\n" + "Jedan, dva ","tri, četiri")); // Traži u nizu / / Prvo pojavljivanje podniza if (s2. IndexOf("this") != -1) Console.WriteLine("Riječ \"this\" pronađena u retku, ona "+ "je na: (0) poziciji" , s2.IndexOf("this")); // Zadnje pojavljivanje podniza if (s2.LastIndexOf("this") != -1) Console.WriteLine("Posljednje pojavljivanje riječi \"this\" je " + "na (0) poziciji", s2.LastIndexOf("this" )); // Pretraživanje 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 retku na poziciji (0)", s2.IndexOfAny(myCh)); // Odredi počinje li red danim podnizom if (s2.StartsWith("ovo je tekst") == true) Console.WriteLine("Podniz pronađen!"); // Odredite da li string sadrži podstring // pomoću primjera određivanja korisnikovog OS stringa myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Vaš operativni sustav Windows sustav XP"); else if (myOS.Contains("NT 6.1")) Console.WriteLine("Vaš operativni sustav je Windows 7"); Console.ReadLine(); ) ) )
Malo o usporedbi nizova u C#
Vjerojatno najuobičajenija od svih operacija niza znakova je uspoređivanje jednog niza s drugim. Prije nego što pogledamo metode usporedbe nizova, vrijedi naglasiti sljedeće: Usporedbe nizova mogu se izvršiti u .NET Frameworku na dva glavna načina:
Prvo, usporedba može odražavati običaje i norme određenog kulturnog okruženja, što su često kulturne postavke koje dolaze u obzir kada se program provodi. Ovo je standardno ponašanje za neke, ali ne sve metode usporedbe.
I drugo, usporedba se može napraviti bez obzira na kulturne postavke samo prema rednim vrijednostima znakova koji čine niz. Općenito govoreći, nekulturalne usporedbe nizova koriste leksikografski poredak (i lingvističke značajke) kako bi odredile je li jedan niz veći, manji ili jednak drugom nizu. U ordinalnoj usporedbi, nizovi su jednostavno poredani na temelju nepromijenjene vrijednosti svakog znaka.
Zbog razlika u načinima na koje se usporedbe nizova razlikuju između kulturnih konteksta i rednih usporedbi, te posljedica svake takve usporedbe, snažno se preporučuje da najbolje metode, trenutno u ponudi Microsofta. Uostalom, odabir pogrešne metode za usporedbu nizova može dovesti do kvar program kada radi u okruženju različitom od onog u kojem je razvijen.
Odabir načina usporedbe nizova znakova vrlo je važna odluka. Kao opće pravilo i bez iznimke, trebali biste odabrati usporedbu nizova na kulturno osjetljiv način ako se to radi u svrhu prikazivanja rezultata korisniku (na primjer, za prikaz niza nizova poredanih leksikografskim redoslijedom). Ali ako nizovi sadrže fiksne informacije koje se ne namjeravaju mijenjati da bi se prilagodile kulturnim razlikama, kao što je naziv datoteke, ključna riječ, adresu web stranice ili vrijednost vezanu uz sigurnost, trebali biste odabrati usporedbu rednog niza. Naravno, karakteristike određene aplikacije koja se razvija će diktirati izbor odgovarajuće metode za usporedbu nizova znakova.
Klasa String pruža različite metode usporedbe nizova, koje su navedene u gornjoj tablici. Najuniverzalnija među njima je Compare() metoda. Omogućuje usporedbu dva niza u cijelosti ili djelomično, osjetljivo na velika ili mala slova, na način određen parametrom tipa Usporedba nizova, kao i informacije o kulturi koje pruža parametar tipa KulturaInfo.
Ona preopterećenja metode Compare() koja ne uključuju parametar tipa StringComparison izvode usporedbu nizova znakova osjetljivu na velika i mala slova i kulturu. A u onim preopterećenim varijantama koje ne sadrže parametar tipa CultureInfo, informacije o kulturnom okruženju određene su trenutnim okruženjem vremena izvođenja.
Vrsta StringComparison je enumeracija koja definira vrijednosti prikazane u tablici ispod. Pomoću ovih vrijednosti možete stvoriti usporedbu nizova koja odgovara vašim potrebama specifična primjena. Stoga dodavanje parametra tipa StringComparison proširuje mogućnosti metode Compare() i drugih metoda usporedbe kao što je Equals(). To također omogućuje nedvosmisleno označavanje načina na koji se nizovi namjeravaju uspoređivati.
Zbog razlika između kulturno osjetljivih usporedbi nizova i ordinalnih usporedbi, važno je biti što je moguće precizniji u tom pogledu.
Značenje | Opis |
---|---|
CurrentCulture | Usporedbe nizova se rade pomoću trenutne postavke parametri kulturnog okruženja |
CurrentCultureIgnoreCase | Usporedbe nizova vrše se pomoću trenutnih postavki kulture, ali ne razlikuju velika i mala slova |
InvariantCulture | Usporedbe nizova se rade pomoću nepromjenjivih, tj. univerzalne podatke o kulturnoj sredini |
InvariantCultureIgnoreCase | Usporedbe nizova se rade pomoću nepromjenjivih, tj. univerzalni kulturni podaci i neosjetljivi su na velika i mala slova |
Redni | Usporedbe nizova se rade pomoću rednih vrijednosti znakova u nizu. U tom slučaju može doći do poremećaja leksikografskog reda i simboli prihvaćeni u određenoj kulturnoj sredini ignoriraju se |
OrdinalIgnoreCase | Usporedbe nizova se rade pomoću rednih vrijednosti znakova u nizu, ali nisu osjetljive na velika i mala slova |
U svakom slučaju, metoda Compare() vraća negativnu vrijednost ako je prvi niz koji se uspoređuje manji od drugog; pozitivan ako je prvi niz koji se uspoređuje veći od drugog; i konačno, nula ako su oba niza koja se uspoređuju jednaka. Iako metoda Compare() vraća nulu ako su nizovi koji se uspoređuju jednaki, općenito je bolje koristiti metodu Equals() ili operator == da se utvrdi jesu li nizovi znakova jednaki.
Činjenica je da metoda Compare() određuje jednakost uspoređivanih nizova na temelju njihovog redoslijeda sortiranja. Stoga, ako se napravi kulturološka usporedba nizova, oba niza mogu na kraju biti ista u svom redoslijedu sortiranja, ali ne i jednaka u sadržaju. Prema zadanim postavkama, jednakost niza se određuje u metodi Equals(), na temelju rednih vrijednosti znakova i bez uzimanja u obzir kulturnog okruženja. Stoga se prema zadanim postavkama oba niza uspoređuju u ovoj metodi radi apsolutne jednakosti znak po znak, slično kao što se to radi u operatoru ==.
Unatoč velikoj svestranosti metode Compare(), za jednostavne redne usporedbe nizova znakova lakše je koristiti metodu CompareOrdinal(). Konačno, imajte na umu da metoda CompareTo() izvodi samo kulturno osjetljive usporedbe nizova.
Sljedeći program demonstrira upotrebu metoda Compare(), Equals(), CompareOrdinal() i operatora == i != za usporedbu nizova znakova. Imajte na umu da prva dva primjera usporedbe jasno pokazuju razlike između kulturološki osjetljivih usporedbi nizova i rednih usporedbi u engleskom govornom okruženju:
Korištenje sustava; Primjer klase ( static void Main() ( string str1 = "alpha"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alpha"; string str5 = "alpha, beta"; int rezultat; / / Prvo, pokažite razlike između kulturalno osjetljive usporedbe nizova // i ordinalne usporedbe rezultat = String.Compare(str1, str2, StringComparison.CurrentCulture); Console.Write("Kulturalno osjetljive usporedbe nizova: "); if (rezultat 0 ) Console.WriteLine(str1 + " veći od " + str2); inače Console.WriteLine(str1 + " jednako " + str2); rezultat = String.Compare(str1, str2, StringComparison.Ordinal); Console.Write(" Redovi redne usporedbe: "); if (rezultat 0) Console.WriteLine(str1 + " veći od " + str2); else Console.WriteLine(str1 + " jednako " + str4); // Koristite rezultat metode CompareOrdinal() = String.CompareOrdinal( str1, str2); Console.Write("Usporedba nizova pomoću metode CompareOrdinal():\n"); if (rezultat 0) Console.WriteLine(str1 + " veće od " + str2); else Konzola .WriteLine(str1 + " jednako " + str4); Console.WriteLine(); // Utvrdite jednakost niza korištenjem == operatora // Ovo je redna usporedba nizova znakova if (str1 == str4) Console.WriteLine(str1 + " == " + str4); // Definirajte nejednakost linije koristeći != operator if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Console.WriteLine(); // Izvođenje redne usporedbe nizova bez obzira na velika i mala slova // koristeći metodu Equals() if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Usporedba nizova pomoću metode Equals() s " + "Parametar OrdinalIgnoreCase: \n" + str1 + " jednako " + str2); Console.WriteLine(); // Usporedi dijelove nizova if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Usporedi nizove uzimajući u obzir trenutno kulturno okruženje:" + "\n3 prvi znakovi niza " + str2 + " više od prva 3 znaka retka " + str5); ) ) )
Pokretanje ovog programa daje sljedeće rezultate:
U moderni standard C++ definira klasu s funkcijama i svojstvima (varijablama) za organizaciju rada sa stringovima (u klasičnom C jeziku nema stringova kao takvih, postoje samo nizovi znakova char):
#uključi
#uključi#uključi
Za rad s nizovima također morate povezati standardni prostor imena:
Korištenje imenskog prostora std;
U protivnom ćete svugdje morati navesti deskriptor klase std::string umjesto string.
Ispod je primjer programa koji radi sa stringom (ne radi u starijim C-kompatibilnim prevoditeljima!):
#uključi
Glavne karakteristike koje klasa string ima:
- inicijalizacija s nizom znakova (ugrađeni tip niza) ili drugim objektom tipa niz. Ugrađeni tip nema drugu mogućnost;
- kopiranje jednog retka u drugi. Za ugrađeni tip morate koristiti funkciju strcpy();
- Pristup pojedinačni likovi redaka za čitanje i pisanje. U ugrađenom nizu, to se radi korištenjem operacije indeksa ili neizravnog adresiranja pomoću pokazivača;
- uspoređujući dva niza radi jednakosti. Za ugrađeni tip koriste se funkcije obitelji strcmp();
- ulančavanje (ulančavanje) dva niza, što daje rezultat ili kao treći niz ili umjesto jednog od izvornih. Za ugrađeni tip koristi se funkcija strcat(), ali za dobivanje rezultata nova linija, trebate uzastopno koristiti funkcije strcpy() i strcat(), a također voditi računa o dodjeli memorije;
- ugrađena sredstva za određivanje duljine niza (funkcije članice klase size() i l ength()). Jedini način da saznate duljinu niza ugrađenog tipa je izračunavanje pomoću funkcije strlen();
- sposobnost otkrivanja je li niz prazan.
Pogledajmo ove osnovne sposobnosti u detaljima.
Inicijaliziranje nizova pri opisivanju i duljina niza(ne uključujući završni nulti terminator):
String str("Moj niz\n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";
String također može biti prazan:
Niz st2;
Da to provjerim je li linija prazna, možete usporediti njegovu duljinu s 0:
If (! st.size()) // prazno
ili koristite metodu empty(), koja vraća true za prazan niz i false za neprazan:
If (st.empty()) // prazno
Treći oblik stvaranja niza inicijalizira objekt tipa string drugim objektom istog tipa:
Niz st3(st);
Niz st3 inicijalizira se nizom st. Kako možemo osigurati ove linije se podudaraju? Upotrijebimo operator usporedbe (==):
If (st == st3) // inicijalizacija radi
Kako kopirati jedan redak u drugi? Korištenje normalnog operatora dodjele:
St2 = st3; // kopiraj st3 u st2
Za spajanje nizova koristi se operator zbrajanja (+) ili operator zbrajanja plus dodjeljivanja (+=). Neka su dana dva retka:
Niz s1("zdravo, "); niz s2("svijet\n");
Možemo dobiti treći niz koji se sastoji od ulančavanja prva dva, na ovaj način:
Niz s3 = s1 + s2;
Ako želimo dodati s2 na kraj s1, trebali bismo napisati:
S1 += s2;
Operacija zbrajanja može ulančati objekte klase niz ne samo međusobno, već i s ugrađenim nizovima tipa. Gornji primjer možete prepisati tako da posebni znakovi i interpunkcijski znakovi budu predstavljeni ugrađenim tipom char *, a značajne riječi predstavljene objektima niza klase:
Const char *pc = ", "; niz s1("zdravo"); niz s2("svijet"); niz s3 = s1 + pc + s2 + "\n"; cout<< endl << s3;
Takvi izrazi rade jer prevoditelj "zna" kako automatski pretvoriti objekte ugrađenog tipa u objekte klase string. Također je moguće jednostavno dodijeliti ugrađeni niz string objektu:
Niz s1; const char *pc = "niz znakova"; s1 = pc; // Točno
Inverzna transformacija u ovom slučaju Ne radi. Pokušaj izvođenja sljedeće inicijalizacije niza ugrađenog tipa izazvat će pogrešku kompilacije:
Znak *str = s1; // pogreška kompilacije
Da biste izvršili ovu konverziju, morate izričito pozvati funkciju članicu koja se zove c_str() ("C niz"):
Const char *str = s1.c_str();
Funkcija c_str() vraća pokazivač na niz znakova koji sadrži niz string objekta onako kako bi se pojavio u ugrađenoj vrsti niza. Ključna riječ const ovdje sprječava "opasnu" mogućnost u modernim vizualnim okruženjima izravne izmjene sadržaja objekta putem pokazivača.
DO pojedinačni likovi Objektu tipa string, poput ugrađenog tipa, može se pristupiti pomoću operacije indeksa. Na primjer, ovdje je dio koda koji sve točke zamjenjuje podvlakama:
String str("www.disney.com"); int veličina = str.veličina(); za (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;
Zamijeni(str.begin(), str.end(), ".", "_");
Istina, ovdje se ne koristi metoda zamjene klase nizova, već istoimeni algoritam:
#uključi
Budući da se string objekt ponaša kao spremnik, na njega se mogu primijeniti drugi algoritmi. To vam omogućuje rješavanje problema koji nisu izravno riješeni funkcijama klase nizova.
Ispod je kratak opis glavnih operatora i funkcija klase string; veze u tablici vode do opisa na ruskom jeziku na Internetu. Potpuniji popis mogućnosti klase string može se pronaći, primjerice, na Wikipediji ili na web stranici cplusplus.com.