Kako podesiti pametne telefone i računare. Informativni portal

String tip podataka u C. C žice

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 int main () (char s; char * p; p = dobija (s); printf ("\ n String% s uneto.", s); if (p) printf ("\ n String% s uneseno.", p); vrati 0;)

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 #include #include int main () (char s; int x, err; do (printf ("\ n Unesite cijeli broj ->"); dobiva (s); err = sscanf (s, "% d", & x); if ( err ! = 1) printf ("\ n greška u unosu.");) Dok (err! = 1); printf ("\ n unesen cijeli broj ->% d", x); vrati 0;)

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

Programer kaže:

Zdravo! Pročitao sam tvoj članak. Bio sam veoma tužan i smešan u isto vreme. Ova vaša fraza je posebno ubijajuća: "Pošto se varijabla tipa char često koristi kao niz, broj mogućih vrijednosti je određen." 😆 😆 😆
Ne smijem ti se. Izrada web stranice je zaista podvig. Samo želim da vas podržim savjetima i ukažem na nekoliko grešaka.

1. Vrijednost varijable tipa char se dodjeljuje na sljedeći način:

ovdje:

Char a = * "A";

Pointer na niz je neadresiran i, kao rezultat, vraća se vrijednost prvog elementa niza, tj. 'A'

2. Nuliranje se vrši na sljedeći način:

Char a = NULL;
char b = ();

// I ovako se briše linija u tijelu programa

"" - ovaj znak se naziva nulti terminator. Postavlja se na kraj reda. Vi ste sami, a da to niste znali, ispunili s1 niz iz vašeg članka ovim simbolom. Ali bilo je moguće dodijeliti ovaj simbol samo nultom elementu niza.

3. Slobodno koristite terminologiju.
Znak = je operacija dodjeljivanja.
Znak * je operacija pozivanja.
Mislim na ovaj fragment članka: "Sve se pokazalo tako jednostavno, prije znaka = morali ste staviti znak * i morali ste deklarirati broj elementa (nula odgovara prvom)"

Nemojte me pogrešno shvatiti, članak u ovakvom stanju ne može postojati. Ne budite lijeni, prepišite to.
Imate veliku odgovornost! Ozbiljan sam. Stranice vaše web stranice bile su uključene u prvu stranicu rezultata Yandex pretraživanja. Mnogi ljudi su već počeli da ponavljaju greške za vama.

Sretno! Možeš to podnijeti!

:
Znam to odavno, samo je tesko stalno precitati 200 clanaka da se nesto popravi. A neki bezobrazni tipovi pišu tako da čak i kada se zna šta je bolje popraviti, nema želje da se to popravi.

Rado ću popraviti i druge greške. ispravite nepreciznosti ako se pojave. Cijenim tvoju pomoć. Hvala, to znam odavno, samo je tesko stalno precitati 200 clanaka da se nesto popravi. A neki bezobrazni tipovi pišu tako da čak i kada se zna šta je bolje popraviti, nema želje da se to popravi.
Sa vašim char b = (); Ovo uopšte nije nula. bi provjerio barem b.
ako govorimo o nultom karakteru ""; Znala sam jako dobro kada sam popunjavala red sa njima i cilj je bio da pokažem pravo čišćenje, a ne vidljivo oku, jer red sadrži smeće koje ponekad stane na put. Bili biste pažljiviji sa terminima, "null-termination character" ili samo "null character", a ne terminator))) A karakter terminatora zvuči jednostavno super.

Modernizujem članak, ali neću prelaziti na tuđi stil. Ako smatram da je početniku jasnije ovako, a ne onako kako želi, onda ću tako ostaviti. I ti me nemoj pogrešno shvatiti. Riječ "znak" je za slabog početnika mnogo lakše razumjeti i zapamtiti nego definiciju i naziv svakog znaka. U ovome nema apsolutno nikakve greške, znak je - znak. Manji naglasak na jednoj stvari daje veći naglasak na drugoj.

Rado ću popraviti i druge greške. ispravite nepreciznosti ako se pojave. Cijenim tvoju pomoć. Hvala ti.

Zdravo opet!
Želim da razjasnim. Termin "zero-terminator" (terminator) koristio je moj profesor na univerzitetu. Očigledno je ovo stara škola!
Što se tiče nula linija.
char b = (); Ovo je stvarno nula. Cijeli niz je ispunjen nulama. Ne vjerujte - provjerite!
Ako string posmatramo u njegovom prirodnom, svakodnevnom smislu, onda će "prazan" biti niz u kome nema ni jednog karaktera. Stoga je u 99,9% slučajeva dovoljno dodati null karakter. Obično obrada stringa ide do prvog nul znaka, a koji znakovi ga slijede više nije važno. Razumijem da ste željeli nulirati niz. Upravo sam odlučio ponuditi klasičnu verziju provjerenu vremenom.

:
Kada "obično obrada niza ide do prvog nul znaka, a koji znakovi slijede više nije važno" - da, niz se resetuje na nulu
Ako uzmemo u obzir "stvarno nuliranje svih ćelija u nizu (o čemu sam pisao)" - ne, ne nuliranje, pa čak ni prvi znak nije nula. Provjerio sam ovu opciju. MinGW (CodeBlock) - cijeli niz daje znak "a"
Ne mislim da je to razlog za kontroverzu.

U ovom vodiču ćemo raspravljati o nizovima u C stilu, možda ste već vidjeli ove linije na našoj web stranici ili u bilo kojem drugom tutorijalu. U stvari, C stringovi su samo nizovi znakova, ali sa svojim specifičnostima, tako da uvijek znamo gdje je kraj stringa. U ovom članku ćemo pogledati nekoliko funkcija za rad sa stringovima, na primjer, vi - kopirate, spojite, dobijete dužinu niza.

Šta su žice?

Imajte na umu da pored stringova u C stilu, koji su u suštini jednostavni nizovi, postoje i literali stringova kao što je ovaj "literal". U stvarnosti, i stringovi i literali su jednostavno skupovi znakova koji se nalaze jedan pored drugog u memoriji računara. Ali još uvijek postoji razlika između nizova i literala, literali se ne mogu mijenjati, a nizovi - možete.

Svaka funkcija koja prihvaća string u C stilu također može uzeti literal kao parametar. Postoje i neki entiteti u B koji mogu izgledati kao nizovi, iako u stvari nisu. Sada govorim o znakovima, oni su stavljeni u jednostruke navodnike, evo primjera - "a", kao što vidite, ovo nije niz. Znak se može dodijeliti nizu na određenoj lokaciji, ali znakovi se ne mogu obraditi kao string. Ako se sećate, nizovi rade kao pokazivači, tako da ako prosledite jedan znak po stringu, to će se smatrati greškom.

Iz svega navedenog, trebali biste razumjeti da su stringovi nizovi znakova, a literali stringova riječi okružene dvostrukim navodnicima. Evo još jednog primjera literala:

"Ovo je statički niz"

Jeste li zaboravili na malo gore spomenute specifičnosti žica? Dakle, C stringovi uvijek moraju biti završeni nultim karakterom, doslovno "\ 0". Stoga, da biste deklarirali niz koji se sastoji od 49 slova, morate rezervirati dodatnu ćeliju za null karakter:

Char myString;

Kao što možete vidjeti iz primjera, dužina niza je 50 znakova, od kojih će 49 uzeti niz, a jedan, posljednji će uzeti null karakter. Važno je zapamtiti da na kraju C nizova uvijek mora biti nulti karakter, baš kao što postoji tačka na kraju svake rečenice. Iako se nulti znak ne prikazuje na linijskom izlazu, on i dalje zauzima memorijski prostor. Dakle, tehnički, možete pohraniti samo 49 slova u niz od pedeset elemenata, jer je posljednji znak potreban za završetak stringa. Pored toga, pokazivači se mogu koristiti i kao stringovi. Ako pročitate članak, možete učiniti nešto poput ovoga:

Char * myString; // pokazivač tipa char myString = malloc (sizeof (* myString) * 64); // dodjela memorije

U ovom primjeru, dodijelili smo 64 memorijske lokacije za polje myString. Koristite funkciju free () da oslobodite memoriju.

Besplatno (myString);

Korištenje žica

Stringovi su korisni kada trebate izvršiti različite operacije s tekstualnim informacijama. Na primjer, ako želite da korisnik unese ime u program, morate koristiti string. Korištenje scanf () za unos stringa funkcionira, ali može uzrokovati prelijevanje bafera. Na kraju krajeva, ulazni niz može biti veći od veličine niza bafera. Postoji nekoliko načina za rješavanje ovog problema, ali najlakši način je korištenje, što je deklarirano u zaglavlju .

Kada pročita unos od korisnika, pročitat će sve osim posljednjeg znaka. Nakon toga, na kraju reda za čitanje, postavit će null terminator. Funkcija fgets () će čitati znakove sve dok korisnik ne pritisne Enter. Pogledajmo primjer korištenja fgets ():

#include int main () (char myString; // dugi niz printf ("Unesite dugi niz:"); fgets (myString, 100, stdin); // pročitajte niz iz ulaznog toka printf ("Unijeli ste sljedeći niz: % s", myString); getchar ();)

Prvi parametar za fgets () je string, drugi parametar je veličina stringa, a treći parametar je pokazivač na ulazni tok podataka.

Rezultat programa:

<ВВОД>...

Kao što vidite, iz izlaza programa, znak novog reda "\ n" je ušao u ulaznu liniju. To se dogodilo zbog činjenice da je fgets () pročitao pritisak na tipku Enter u string myString i izašao. To znači da ćete možda morati ručno ukloniti znak novog reda. Jedan od načina da se to uradi je iteracija karaktera. Izmijenimo program i uklonimo znak za novi red:

#include int main () (char myString; // dugi niz printf ("Unesite dugi niz:"); fgets (myString, 100, stdin); // čitanje stringa iz ulaznog toka int i; for (i = 0; i< 100; i++) { if (myString[i] == "\n") { myString[i] = "\0"; break; } } printf("Вы ввели следующую строку: %s", myString); getchar(); }

Imajte na umu da ako ulazni niz sadrži manje od 100 znakova, onda će znak novog reda također biti uključen u string. Stoga, možemo ukloniti ovaj znak pomoću jednostavne iteracije. Programu smo dodali petlju u kojoj ponavljamo znakove niza, redovi 12-19... A kada naiđemo na znak za novi red, zamjenjujemo ga null karakterom, red 16... Rezultat programa:

Unesite dugu liniju: Sudbina ostavlja svoj trag Uneli ste sljedeći red: Sudbina ostavlja svoj trag Pritisnite da zatvorite ovaj prozor<ВВОД>...

To je sve za sada. U sljedećem članku ću vam reći o posebnim funkcijama za rad sa stringovima.

PS: Svi volimo gledati različite video snimke, ali ponekad se desi da nije uvijek moguće pustiti neke formate video datoteka. Dakle, ovaj problem možete riješiti pomoću programa - xilisoft converter ultimate. Možete jednostavno brzo pretvoriti video iz jednog formata u drugi. Osim toga, ovaj program također može pretvoriti audio datoteke i animirane slike.

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 niza 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:

Metode rada sa nizovima
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 brojanja, 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. A 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 ("Štaviše, imaju isti tekst "); // Konkatenacija 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 \ "nađena je u redu, nalazi se" + "na: (0) poziciji" , s2.IndexOf ("this")); / / Posljednje pojavljivanje podniza if (s2.LastIndexOf ("this")! = -1) Console.WriteLine ("Posljednje pojavljivanje riječi \" this \ "je " + "na (0) poziciji", s2.LastIndexOf ("this" )); // Pretraživanje niza znakova char myCh = ("Y", "x", "t"); if (s2.IndexOfAny (myCh)! = -1) Console.WriteLine ("Jedan od znakova iz niza ch "+" pronađen u trenutnoj linija na poziciji (0) ", s2.IndexOfAny (myCh)); // Odrediti 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 metoda poređenja za poređenje nizova i implikacija svakog takvog 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ćenja Compare () koja 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.

Vrijednosti definirane u nabrajanju StringComparison
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 znak po znak, baš kao 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.

Sljedeći program demonstrira upotrebu metoda Compare (), Equals (), CompareOrdinal () i operatora == i! = za upoređivanje 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 osjetljivih na kulturu i rezultata poređenja redova = String.Compare (str1, str2, StringComparison.CurrentCulture); Console.Write ("Poređenje stringova osjetljivih na kulturu:"); 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:

Molimo obustavite AdBlock na ovoj stranici.

Dakle, nizovi u C. Za njih ne postoji poseban tip podataka, kao što se radi u mnogim drugim programskim jezicima. U C, string je niz znakova. Za označavanje kraja reda koristi se znak "\ 0", o čemu smo govorili u posljednjem dijelu ove lekcije. Ni na koji način se ne prikazuje na ekranu, pa ga nećete moći pogledati.

Kreiranje i inicijalizacija niza

Pošto je string niz znakova, deklarisanje i inicijalizacija stringa je isto kao i za jednodimenzionalne nizove.

Sljedeći kod ilustruje različite načine inicijalizacije nizova.

Listing 1.

Char str; char str1 = ("Y", "o", "n", "g", "C", "o", "d", "e", "r", "\ 0"); char str2 = "Zdravo!"; char str3 = "Zdravo!";

Slika 1 Deklarisanje i inicijalizacija stringova

U prvom redu samo deklarišemo niz od deset znakova. To čak i nije baš niz, pošto nema nulti karakter \ 0 sve dok je samo skup znakova.

Druga linija. Najjednostavniji način inicijalizacije u čelo. Svaki znak deklariramo posebno. Glavna stvar ovdje je da ne zaboravite dodati nulti znak \ 0.

Treći red je analogan drugom redu. Obratite pažnju na sliku. Jer ima manje znakova u nizu na desnoj strani od elemenata u nizu, ostali elementi će biti popunjeni sa \ 0.

Četvrti red. Kao što vidite, ovdje nije navedena veličina. Program će ga automatski izračunati i kreirati niz znakova potrebne dužine. U ovom slučaju, posljednji će biti umetnut nulti znak \ 0.

Kako izvesti string

Dodajmo gornji kod u punopravni program koji će kreirane linije prikazati na ekranu.

Listing 2.

#include int main (void) (char str; char str1 = ("Y", "o", "n", "g", "C", "o", "d", "e", "r", " \ 0 "); char str2 =" Zdravo! "; Char str3 =" Zdravo! "; Za (int i = 0; i< 10; i = i + 1) printf("%c\t",str[i]); printf("\n"); puts(str1); printf("%s\n",str2); puts(str3); return 0; }


Slika 2 Različiti načini prikazivanja niza na ekranu

Kao što vidite, postoji nekoliko osnovnih načina da se string prikaže na ekranu.

  • koristite funkciju printf sa specifikacijom% s
  • upotreba stavlja funkciju
  • koristite funkciju fputs, navodeći stdout kao drugi parametar.

Jedino upozorenje sa funkcijama puts i fputs. Imajte na umu da funkcija puts premotava izlaz u sljedeći red, ali funkcija fputs ne.

Kao što vidite, zaključak je prilično jednostavan.

Ulazni nizovi

Unos nizova je malo komplikovaniji od izlaza. Najjednostavniji način bi bio sljedeći:

Listing 3.

#include int main (void) (char str; gets (str); puts (str); return 0;)

Funkcija gets pauzira program, čita niz znakova unetih sa tastature i smešta ga u niz znakova, čije se ime prosleđuje funkciji kao parametar.
Završetak funkcije gets će biti znak koji odgovara tipki enter i upisan u niz kao nulti karakter.
Jeste li primijetili opasnost? Ako ne, kompajler će vas ljubazno upozoriti na to. Poenta je da get funkcija izlazi samo kada korisnik pritisne tipku enter. Ovo je ispunjeno činjenicom da možemo ići dalje od niza, u našem slučaju - ako se unese više od 20 znakova.
Inače, greške prelivanja bafera ranije su se smatrale najčešćim tipom ranjivosti. I danas se nalaze, ali je postalo mnogo teže koristiti ih za hakovanje programa.

Pa šta imamo. Imamo zadatak: upisati string u niz ograničene veličine. To jest, moramo nekako kontrolirati broj znakova koje je unio korisnik. Ovdje nam funkcija fgets dolazi u pomoć:

Listing 4.

#include int main (void) (char str; fgets (str, 10, stdin); puts (str); return 0;)

Funkcija fgets uzima tri argumenta kao ulaz: varijablu za pisanje stringa, veličinu stringa za pisanje i ime toka odakle se preuzimaju podaci za upisivanje u string, u ovom slučaju, stdin. Kao što već znate iz lekcije 3, stdin je standardni unos, obično povezan sa tastaturom. Uopšte nije neophodno da podaci dolaze iz stdin toka; u budućnosti ćemo ovu funkciju koristiti i za čitanje podataka iz datoteka.

Ako tokom izvršavanja ovog programa unesemo niz duži od 10 karaktera, samo 9 karaktera od početka i svejedno će u niz biti upisan prijelom reda, fgets će string "presjeći" na potrebnu dužinu.

Imajte na umu da fgets ne čita 10 znakova, već 9! Kao što se sjećamo, u stringovima je posljednji znak rezerviran za null karakter.

Hajde da to proverimo. Pokrenimo program od posljednje liste. I unesite red 1234567890. Na ekranu se prikazuje string 123456789.


Slika 3 Primer kako funkcioniše funkcija fgets

Postavlja se pitanje. Gdje je nestao deseti lik? I ja ću odgovoriti. Nigdje nije otišlo, ostalo je u ulaznom toku. Pokrenite sljedeći program.

Listing 5.

#include int main (void) (char str; fgets (str, 10, stdin); puts (str); int h = 99; printf ("do% d \ n", h); scanf ("% d", & h) ) ; printf ("posle% d \ n", h); return 0;)

Evo rezultata njenog rada.


Slika 4 Neprazan stdin bafer

Dozvolite mi da objasnim šta se dogodilo. Nazvali smo funkciju fgets. Otvorila je ulazni stream i čekala da unesemo podatke. Upisali smo 1234567890 sa tastature \ n (\ n mislim pritiskom na tipku Enter). Ovo je otišlo u stdin ulazni tok. Funkcija fgets je, kao što se i očekivalo, uzela prvih 9 znakova 123456789 iz ulaznog toka, dodala im nulti karakter \ 0 i zapisala ga u string str. Ostalo je još 0 \ n u ulaznom toku.

Zatim, deklariramo varijablu h. Njegovu vrijednost prikazujemo na ekranu. Zatim pozivamo funkciju scanf. Ovdje se očekuje da možemo nešto ući, ali od tada 0 \ n visi u ulaznom toku, tada funkcija scanf to doživljava kao naš ulaz, a 0 se upisuje u h varijablu. Zatim ga prikazujemo na ekranu.

Ovo, naravno, nije baš ono ponašanje koje očekujemo. Da bismo se izborili sa ovim problemom, potrebno je obrisati ulazni bafer nakon što iz njega pročitamo red koji je korisnik uneo. Za to se koristi posebna funkcija flush. Ima samo jedan parametar - tok koji treba očistiti.

Popravimo posljednji primjer tako da radi predvidljivo.

Listing 6.

#include int main (void) (char str; fgets (str, 10, stdin); fflush (stdin); // očisti ulazni tok puts (str); int h = 99; printf ("do% d \ n", h ) ; scanf ("% d", & h); printf ("posle% d \ n", h); vrati 0;)

Program će sada raditi kako se očekuje.


Slika 4 Ispiranje stdin bafera sa fflush-om

Sumirajući, mogu se uočiti dvije činjenice. Prvo. Trenutno nije bezbedno koristiti funkciju gets, pa je preporučljivo koristiti funkciju fgets svuda.

Sekunda. Ne zaboravite da ispraznite ulazni bafer ako koristite funkciju fgets.

Ovim se završava razgovor o unosu nizova. Nastavi.

Top srodni članci