Knjižnica za delo z nizi c. Funkcije za obdelavo nizov v C. Delo z nizi. Razred nizov. Konstruktorji razreda. Funkcije assign(), append(), insert(), replace(), erase(), find(), rfind(), compare(), c_str(). Primeri

V tej lekciji bomo obravnavali nize v slogu C; morda ste te nize že videli na naši spletni strani ali v katerem koli drugem učbeniku. Dejansko so C-nizi samo nizi znakov, vendar s svojimi posebnostmi vedno vemo, kje je konec vrstice. V tem članku si bomo ogledali več funkcij za delo z nizi, na primer, vi - kopirajte, združite, pridobite dolžino niza.

Kaj so strune?

Upoštevajte, da poleg nizov v slogu C, ki so v bistvu preprosti nizi, obstajajo tudi literali nizov, kot je ta "literal". V resnici so tako nizi kot literali preprosto nizi znakov, ki se nahajajo drug ob drugem v pomnilniku računalnika. Še vedno pa obstaja razlika med nizi in literali: literalov ni mogoče spremeniti, nizov pa lahko.

Vsaka funkcija, ki sprejme niz v slogu C, lahko sprejme tudi literal kot parameter. Obstaja tudi nekaj entitet v C, ki so lahko videti kot nizi, čeprav v resnici niso. Zdaj govorim o znakih, ti so v enojnih narekovajih, tukaj je primer - "a", kot lahko vidite, to ni niz. Znak se lahko na določeni lokaciji dodeli nizu, vendar znakov ni mogoče obdelati kot niz. Če se spomnite, matrike delujejo kot kazalci, tako da, če v niz podate en sam znak, bo to obravnavano kot napaka.

Iz zgoraj navedenega bi morali ugotoviti, da so nizi nizi znakov, nizovni literali pa besede, obdane z dvojnimi narekovaji. Tu je še en primer dobesednega izraza:

"To je statični niz"

Ste pozabili na specifičnost strun, ki je bila omenjena malo višje? Torej se morajo C-nizi vedno končati z ničelnim znakom, dobesedno »\0«. Zato morate za deklaracijo niza, sestavljenega iz 49 črk, rezervirati dodatno celico za ničelni znak:

Char myString;

Kot lahko vidite iz primera, je dolžina niza 50 znakov, od katerih bo 49 vrstica in en, zadnji, ničelni znak. Pomembno si je zapomniti, da mora biti na koncu C-vrstic vedno ničelni znak, tako kot je na koncu vsakega stavka pika. Čeprav ničelni znak ni prikazan, ko je niz izpisan, še vedno zavzame prostor v pomnilniku. Tehnično lahko torej v nizu petdesetih elementov shranite samo 49 črk, ker je zadnji znak potreben za zaključek niza. Poleg tega se lahko kazalci uporabljajo tudi kot niz. Če ste prebrali članek o , lahko naredite nekaj takega:

Char *myString; // kazalec tipa char myString = malloc(sizeof(*myString) * 64); // dodelitev pomnilnika

V tem primeru smo matriki myString dodelili 64 pomnilniških mest. Za sprostitev pomnilnika uporabite funkcijo free().

Brezplačno (myString);

Uporaba nizov

Nizi so uporabni, ko morate izvesti različne operacije z besedilnimi informacijami. Na primer, če želite, da uporabnik vnese ime v program, bi uporabili niz. Uporaba funkcije scanf() za vnos niza deluje, vendar lahko povzroči prepolnitev medpomnilnika. Navsezadnje je lahko vhodni niz večji od velikosti vmesnega niza. Obstaja več načinov za rešitev tega problema, vendar je najenostavnejši način uporaba , ki je deklarirana v datoteki glave .

Pri branju vnosa uporabnika bo prebral vse znake razen zadnjega. Po tem bo na koncu prebrane vrstice postavljen ničelni zaključek. Funkcija fgets() bo brala znake, dokler uporabnik ne pritisne Enter. Oglejmo si primer uporabe funkcije fgets():

#vključi int main() ( char myString; // dolg niz printf("Vnesite dolg niz: "); fgets(myString, 100, stdin); // preberite niz iz vhodnega toka printf("Vnesli ste naslednji niz: %s", myString); getchar(); )

Prvi parameter funkcije fgets() je niz, drugi parameter je velikost niza, tretji parameter pa je kazalec na vhodni tok podatkov.

Rezultat programa:

<ВВОД>...

Kot lahko vidite, je iz izhoda programa v vhodno vrstico vstopil znak za novo vrstico - "\n". To se je zgodilo, ker je fgets() preštel pritisk gumba Enter v niz myString in dokončal svoje delo. To pomeni, da boste morda morali ročno odstraniti znak za novo vrstico. Eden od načinov za to je naštevanje po znakih. Spremenimo program in odstranimo znak za novo vrstico:

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

Upoštevajte, da če vnosni niz vsebuje manj kot 100 znakov, bo v niz vključen tudi znak za novo vrstico. Zato lahko ta znak odstranimo s preprosto surovo silo. Programu smo dodali zanko, v kateri se potikamo po znakih niza, vrstice 12-19. In ko naletimo na znak nove vrstice, ga zamenjamo z ničelnim znakom, vrstica 16. Rezultat programa:

Vnesite dolgo vrstico: Usoda pušča svoj pečat Vnesli ste naslednjo vrstico: Usoda pušča svoj pečat Če želite zapreti to okno, kliknite<ВВОД>...

To je vse za zdaj. V naslednjem članku vam bom povedal o posebnih funkcijah za delo z nizi.

P.S.: Vsi radi gledamo različne video posnetke, vendar se včasih zgodi, da nekaterih formatov video datotek ni vedno mogoče predvajati. Torej, to težavo lahko rešite s programom - xilisoft converter ultimate. Videoposnetke lahko preprosto hitro pretvorite iz ene oblike v drugo. Poleg tega lahko ta program pretvori tudi zvočne datoteke in animirane slike.

Zadnja posodobitev: 31. 10. 2015

Veženje

Združevanje ali združevanje nizov lahko izvedete z uporabo operatorja + ali metode Concat:

Niz s1 = "zdravo"; niz s2 = "svet"; niz s3 = s1 + " " + s2; // rezultat: niz "zdravo, svet" niz s4 = String.Concat(s3, "!!!"); // rezultat: niz "hello world!!!" Console.WriteLine(s4);

Metoda Concat je statična metoda razreda String, ki za parametra sprejme dva niza. Obstajajo tudi druge različice metode, ki sprejmejo drugačno število parametrov.

Metodo Join lahko uporabite tudi za združevanje nizov:

Niz s5 = "jabolko"; niz s6 = "dan"; niz s7 = "ohranja"; niz s8 = "zdravnik"; niz s9 = "stran"; vrednosti nizov = nov niz (s5, s6, s7, s8, s9); Niz s10 = String.Join(" ", vrednosti); // rezultat: niz "jabolko na dan odžene zdravnika stran"

Tudi metoda Join je statična. Zgoraj uporabljena različica metode ima dva parametra: ločilni niz (v tem primeru presledek) in niz nizov, ki bodo povezani in ločeni z ločilom.

Primerjava nizov

Za primerjavo nizov uporabite statično metodo primerjave:

Niz s1 = "zdravo"; niz s2 = "svet"; int rezultat = String.Compare(s1, s2); če (rezultat<0) { Console.WriteLine("Строка s1 перед строкой s2"); } else if (result >0) ( Console.WriteLine("Vrstica s1 pride za vrstico s2"); ) else ( Console.WriteLine("Vrstici s1 in s2 sta enaki"); ) // rezultat bo "Vrstica s1 pred vrstico s2"

Ta različica metode Compare sprejme dva niza in vrne število. Če je prvi niz po abecedi višji od drugega, je vrnjeno število, manjše od nič. V nasprotnem primeru je vrnjeno število, večje od nič. In tretji primer - če sta niza enaka, se vrne število 0.

Ker je v tem primeru znak h abecedno višji od znaka w, bo prva vrstica višja.

Iskanje v nizu

Z metodo IndexOf lahko določimo indeks prve pojavitve posameznega znaka ali podniza v nizu:

Niz s1 = "zdravo, svet"; char ch = "o"; int indexOfChar = s1.IndexOf(ch); // enako 4 Console.WriteLine(indexOfChar); string subString = "wor"; int indexOfSubstring = s1.IndexOf(subString); // enako 6 Console.WriteLine(indexOfSubstring);

Metoda LastIndexOf deluje na podoben način, le da najde indeks zadnje pojavitve znaka ali podniza v nizu.

Druga skupina metod vam omogoča, da ugotovite, ali se niz začne ali konča z določenim podnizom. Za to sta zasnovani metodi StartsWith in EndsWith. Imamo na primer nalogo izbrisati vse datoteke s pripono .exe iz mape:

Pot niza = @"C:\SomeDir"; string files = Directory.GetFiles(path); za (int i = 0; i< files.Length; i++) { if(files[i].EndsWith(".exe")) File.Delete(files[i]); }

Razdelitev strun

S funkcijo Split lahko razdelimo niz v matriko podnizov. Funkcija Split vzame niz znakov ali nizov kot parameter, ki bo služil kot ločilo. Na primer, preštejmo število besed v izrazu tako, da ga delimo s presledki:

String text = "In zato se je vse to zgodilo"; string words = text.Split(new char ( " " )); foreach (niz s v besedah) ( Console.WriteLine(s); )

To ni najboljši način za delitev s presledki, saj bi lahko imeli v vhodnem nizu več zaporednih presledkov in bi nastala matrika vsebovala tudi presledke, zato je bolje uporabiti drugo različico metode:

String words = text.Split(new char ( " "), StringSplitOptions.RemoveEmptyEntries);

Drugi parameter StringSplitOptions.RemoveEmptyEntries pravi, da je treba vse prazne podnize odstraniti.

Obrezovanje črte

Za obrezovanje začetnih ali končnih znakov uporabite funkcijo Trim:

String text = "hello world"; besedilo = besedilo.Trim(); // rezultat "hello world" text = text.Trim(new char ( "d", "h" )); // rezultat "hello world"

Funkcija Trim brez parametrov odreže presledke na začetku in na koncu ter vrne obrezani niz. Če želite izrecno določiti, kateri začetni in zadnji znaki naj bodo obrezani, lahko funkciji posredujemo niz teh znakov.

Ta funkcija ima delne analoge: funkcija TrimStart obreže začetne znake, funkcija TrimEnd pa obreže končne znake.

Funkcija Substring omogoča obrezovanje določenega dela niza:

String text = "Dober dan"; // odrezano od tretjega znaka text = text.Substring(2); // rezultat "dober dan" Console.WriteLine(text); // izreži najprej na zadnja dva znaka text = text.Substring(0, text.Length - 2); // rezultat "roshy de" Console.WriteLine(text);

Funkcija Substring vrne tudi okrnjeni niz. Prva uporabljena različica uporablja indeks kot parameter, od katerega je treba obrezati niz. Druga različica uporablja dva parametra - indeks začetka obrezovanja in dolžino odrezanega dela vrvice.

Vstavi

Če želite vstaviti eno vrstico v drugo, uporabite funkcijo Vstavi:

String text = "Dober dan"; string subString = "čudovito"; besedilo = besedilo.Vstavi(8, podniz); Console.WriteLine(besedilo);

Prvi parameter v funkciji Insert je indeks, pri katerem naj bo podniz vstavljen, drugi parameter pa je podniz sam.

Odstranjevanje vrstic

Metoda Odstrani pomaga odstraniti del niza:

String text = "Dober dan"; // indeks zadnjega znaka int ind = text.Length - 1; // izrez zadnjega znaka text = text.Remove(ind); Console.WriteLine(besedilo); // izreži prva dva znaka text = text.Remove(0, 2);

Prva različica metode Remove vzame indeks v nizu, od katerega je treba odstraniti vse znake. Druga različica ima še en parameter - koliko znakov je treba odstraniti.

Zamenjava

Če želite zamenjati en znak ali podniz z drugim, uporabite metodo Zamenjaj:

String text = "dober dan"; text = text.Replace("dobro", "slabo"); Console.WriteLine(besedilo); besedilo = besedilo.Zamenjaj("o", ""); Console.WriteLine(besedilo);

V drugem primeru uporabe funkcije Zamenjaj se niz z enim znakom "o" zamenja s praznim nizom, torej se dejansko odstrani iz besedila. Ta metoda olajša brisanje določenega besedila v vrsticah.

Spremeni velike in male črke

Če želite pretvoriti niz v velike in male črke, uporabite funkciji ToUpper() oziroma ToLower():

String hello = "Pozdravljen svet!"; Console.WriteLine(hello.ToLower()); // Pozdravljen, svet! Console.WriteLine(hello.ToUpper()); // POZDRAVLJEN, SVET!

Nizi v C++

Niz je zaporedje (niz) znakov. Če se v izrazu pojavi en sam znak, mora biti zaprt enojni narekovaji. Ko se uporablja v izrazih, je niz zaprt v dvojni narekovaji. Znak za konec vrstice je ničelni znak \0 . V C++ lahko nize opišemo s simboli (niz elementov, kot je char), v katerem naj bo predviden prostor za shranjevanje zaključevalca vrstic.

Na primer, opis niza s 25 znaki bi bil videti takole:

Opišete lahko tudi niz nizov:

Definiran je niz 3 vrstic po 25 bajtov.

Za delo s kazalci lahko uporabite ( char *). Naslov prvega znaka bo začetna vrednost kazalca.

Oglejmo si primer deklaracije in izpisa nizov.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#vključi "stdafx.h"
#vključi
uporaba imenskega prostora std;
int main()
{
setlocale(LC_ALL,"Rus" ) ;
//opiši 3 vrstice, s3 je kazalec
char s2[ 20 ], * s3, s4 [ 30 ] ;
cout<< «s2=» ; cin >> s2; //vnesite niz s2
cout<< «s2=» << s2<< endl;
//vpišemo v s3 naslov vrstice, kjer je shranjen s4. Zdaj v spremenljivkah
//(kazalca) s3 in s4 shranita vrednost istega naslova
s3= s4;
cout<< «s3=» ; cin >> s3; //vnesite vrstico s3
//izpis vrstic s3 in s4 na zaslon, čeprav kot rezultat dodelitve s3=s4;
//zdaj sta s3 in s4 ista stvar
cout<< «s3=» << s3<< endl;
cout<< «s4=» << s4<< endl;
sistem ("pavza");
vrni 0;
}

Rezultat programa:

Vendar je treba upoštevati, da če uporabnik v eno spremenljivko vnese besede, ločene s presledkom, bo program deloval drugače:

Bistvo je v tem, da funkcija cin vnese vrstice do naletenega prostora. Bolj vsestranska funkcija je getline.

cin.getline(char *s, int n);

Zasnovan za vnos nizov s tipkovnice s s presledki, vrstica ne sme vsebovati več kot n znakov. Zato je za pravilen vnos vrstic, ki vsebujejo presledek, potrebno zamenjati v našem programu cin>>s na cin.getline(s, 80).

Operacije nizov

Niz je mogoče obdelati kot matriko znakov z uporabo algoritmov za obdelavo matrike ali z uporabo posebnih funkcij za obdelavo nizov, od katerih so nekatere navedene spodaj. Za delo s temi nizi morate vključiti knjižnico cstring.

Če želite število pretvoriti v niz, lahko uporabite funkcijo sprintf iz knjižnice stdio.h.

Nekaj ​​funkcij za delo z nizi:

Prototip funkcije Opis funkcije
size_t strlen(const char *s) izračuna dolžino niza s v bajtih.
char *strcat(char *dest, const char *scr) pripne niz src na konec niza dest, nastali niz se vrne kot rezultat
char *strcpy(char *dest, const char *scr) kopira niz scr na pomnilniško lokacijo, na katero kaže dest
char strncat(char *dest, const char *dest, size_t maxlen) doda maxlen znakov niza src na konec niza dest
char *strncpy(char *dest, const char *scr, size_t maxlen) kopira maxlen znakov niza src na pomnilniško lokacijo, na katero kaže dest
int ctrcmp(const char *s1, const char *s2) primerja dva niza v leksikografskem vrstnem redu, pri čemer upošteva razliko med velikimi in malimi črkami, funkcija vrne 0, če se niza ujemata, vrne - 1, če je s1 v abecednem vrstnem redu pred s2, in 1 v nasprotnem primeru.
int strncmp(const char *s1, const char *s2, size_t maxlen) primerja znake maxlen dveh nizov v leksikografskem vrstnem redu; funkcija vrne 0, če se niza ujemata, vrne - 1, če je s1 po abecedi postavljen pred s2, in 1 v nasprotnem primeru.
dvojni atof(const char *s) pretvori niz v realno število; če pretvorba ne uspe, se vrne število 0
dolgi atol (const char *s) pretvori niz v dolgo celo število in vrne 0, če pretvorba ne uspe
char *strchr(const char *s, int c); vrne kazalec na prvo pojavitev znaka c do črte, na katero kaže s. Če simbol c ni najden, vrne NULL
char *strupr(char *s) pretvori znake v nizu, na katerega kaže s, v velike črke in ga nato vrne

podatkovni tip niz

Poleg dela z nizi kot nizom znakov obstaja v C++ poseben tip podatkov vrvica. Za vnos spremenljivk te vrste lahko uporabite cin, ali posebno funkcijo getline.

getline(cin, s);

Tukaj s- ime spremenljivke vhodnega tipa vrvica.

Ko definirate spremenljivko te vrste, lahko tej spremenljivki takoj dodelite vrednost.

spremenljivke nizov;

Tukaj var- ime spremenljivke, s- konstanta niza. Kot rezultat te izjave je ustvarjena spremenljivka var vrsta vrvica, vanj pa se zapiše vrednost konstante niza s. na primer

niz v("Pozdravljeni");

Niz je ustvarjen v, v katerega je zapisana vrednost zdravo.

Dostop do i-ti linijski element s vrsta vrvica izvedeno na standarden način s[i]. Nad vrsticami kot vrvica Definirane so naslednje operacije:

  • dodelitve, na primer s1=s2;
  • združevanje nizov (s1+=s2 ali s1=s1+s2) - nizu s1 doda niz s2, rezultat se shrani v niz s1, primer združevanja nizov:
  • primerjave nizov na podlagi leksikografskega reda: s1=s2, s1!=s2, s1 s2, s1<=s2, s1>=s2 - rezultat bo logična vrednost;

Pri obdelavi nizov, kot je vrvica Uporabite lahko naslednje funkcije:

  • s.substr(pos, dolžina)- vrne podniz iz niza s, začenši s številko poz dolga dolžina znaki;
  • s.prazno()- vrne true, če je niz s prazno, lažno - drugače;
  • s.insert(pos, s1)- vstavi vrstico s1 v linijo s, začenši s položaja poz;
  • s.remove(pos, dolžina)- izbriše iz vrstice s podniz dolžina dolga poz znaki;
  • s.find(s1, pos)- vrne številko prve pojavitve niza s1 v linijo s, iskanje se začne s številko poz, parameter poz lahko odsoten, v tem primeru se iskanje začne od začetka vrstice;
  • s.findfirst(s1, pos)- vrne številko prve pojavitve katerega koli znaka iz niza s1 v linijo s, iskanje se začne s številko poz, ki morda manjkajo.

Ruski jezik za godala

Mislim, da ste že opazili, da se pri izpisu ruskih črk v konzoli pojavijo »levi« znaki. Da bi se izognili temu nesporazumu, morate uporabiti funkcijo tretje osebe CharToOemA. Povezovanje knjižnice windows.h, je potrebno, da lahko naša funkcija pretvori nize v drugo kodiranje. Potrebujemo tudi dodatno matriko znakov. Izvorna koda programa bo videti takole:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#vključi "stdafx.h"
#vključi
#vključi
uporaba imenskega prostora std;
int main()
(setlocale(LC_ALL, "Rus") );
char s[ 255 ] = ( "Moram se preobraziti"} ;
char * pre= nov char [ 255 ] ;
CharToOemA(s, pre); //Pretvorba
cout<< s;
izbrisati pre;
sistem ("pavza>>praznina");
vrni 0;
}

Pravkar opisana metoda je precej neprijetna. Vendar obstaja enostavnejša rešitev za "ruski" problem. Kot lahko vidite, program uporablja funkcijo setlocale(); namesto tega je bolj priročno vključiti naslednjo konstrukcijo v glavno funkcijo.

34

--- C# Guide --- Nizi

Z običajnega programskega vidika niz podatkovni tip niz je eden najpomembnejših v C#. Ta vrsta definira in podpira znakovne nize. V številnih drugih programskih jezikih je niz niz znakov. In v C# so nizi objekti. Zato je tip niza referenčni tip.

Gradbeni nizi

Najenostavnejši način za sestavo znakovnega niza je uporaba nizovnega literala. Naslednja vrstica kode na primer dodeli referencni spremenljivki niza str sklic na literal niza:

String str = "Primer niza";

V tem primeru se spremenljivka str inicializira z zaporedjem znakov "Primerni niz". Objekt tipa string je mogoče ustvariti tudi iz matrike tipa char. Na primer:

Chararray = ("e", "x", "a", "m", "p", "l", "e"); niz str = nov niz (niz znakov);

Ko je objekt niza ustvarjen, ga lahko uporabite povsod, kjer potrebujete niz besedila v narekovajih.

Obstojnost niza

Nenavadno je, da vsebine objekta tipa niz ni mogoče spremeniti. To pomeni, da ko je zaporedje znakov ustvarjeno, ga ni več mogoče spremeniti. Toda ta omejitev prispeva k učinkovitejši implementaciji znakovnih nizov. Zato se ta na videz očitna pomanjkljivost dejansko spremeni v prednost. Če je torej niz potreben kot različica obstoječega niza, je treba za ta namen ustvariti nov niz, ki vsebuje vse potrebne spremembe. In ker se neuporabljeni objekti nizov samodejno zbirajo kot smeti, vam sploh ni treba skrbeti za usodo nepotrebnih nizov.

Vendar je treba poudariti, da se spremenljivke sklicevanja na nize (to je objekte tipa niz) spreminjajo in se zato lahko nanašajo na drug objekt. Toda vsebina samega objekta niza se ne spremeni, ko je ustvarjen.

Poglejmo primer:

Statični void addNewString() ( niz s = "To je moja poteza"; s = "To je nova poteza"; )

Prevedimo aplikacijo in naložimo nastali sklop v pripomoček ildasm.exe. Slika prikazuje kodo CIL, ki bo ustvarjena za metodo void addNewString():

Upoštevajte, da obstajajo številni klici operacijske kode ldstr (nalaganje niza). Ta opcijska koda CIL ldstr izvede nalaganje novega predmeta niza v upravljano kopico. Posledično bo prejšnji objekt, ki je vseboval vrednost »This is my stroke«, na koncu zbran v smeti.

Delo z nizi

V razredu System.String na voljo je niz metod za določanje dolžine znakovnih podatkov, iskanje podniza v trenutnem nizu, pretvorbo znakov iz velikih v male črke in obratno itd. Nato si bomo podrobneje ogledali ta razred.

Lastnost razreda polja, indekserja in niza

Razred String definira eno polje:

Javni statični niz samo za branje Prazen;

Polje Empty označuje prazen niz, tj. niz, ki ne vsebuje nobenih znakov. To se razlikuje od prazne reference niza, ki je preprosto narejena na neobstoječi objekt.

Poleg tega razred String definira en indekser samo za branje:

Javno označi to ( get; )

Ta indeksator vam omogoča, da dobite znak na določenem indeksu. Indeksiranje nizov, tako kot nizov, se začne od nič. Objekti nizov so trajni in se ne spreminjajo, zato je smiselno, da razred nizov podpira indekser samo za branje.

Končno razred String definira eno lastnost samo za branje:

Public int Dolžina ( get; )

Lastnost Length vrne število znakov v nizu. Spodnji primer prikazuje uporabo kazalnika in lastnosti Length:

Uporaba sistema; class Primer ( static void Main() ( string str = "Simple string"; // Pridobite dolžino niza in 6. znak v vrstici z uporabo indekserja Console.WriteLine("Dolžina niza je (0), 6. znak je "(1)"" , str.Length, str); ) )

Operatorji razreda nizov

Razred String preobremeni naslednja dva operatorja: == in !=. Operator == se uporablja za preverjanje enakosti dveh nizov znakov. Ko se operator == uporabi za sklice na objekte, običajno preizkusi, ali sta oba sklica narejena na isti objekt. In ko je operator == uporabljen za sklice na objekte tipa String, se vsebina samih nizov primerja glede enakosti. Enako velja za operator !=. Ko se uporabi za sklice na objekte tipa String, se vsebina samih nizov primerja glede neenakosti. Vendar drugi relacijski operatorji, vključno z =, primerjajo sklice na objekte tipa String na enak način kot primerjajo sklice na objekte drugih vrst. Če želite preveriti, ali je en niz večji od drugega, bi morali poklicati metodo Compare(), definirano v razredu String.

Kot bo postalo jasno, se številne vrste primerjav znakovnih nizov opirajo na kulturne informacije. Vendar to ne velja za operatorja == in !=. Navsezadnje preprosto primerjajo redne vrednosti znakov v nizih. (Z drugimi besedami, primerjajo binarne vrednosti znakov, ki niso bili spremenjeni s kulturnimi normami, to je področnimi standardi.) Zato ti operaterji izvajajo primerjave nizov na način, ki ni občutljiv na velike in male črke ter na kulturo.

Metode razreda nizov

Naslednja tabela navaja nekaj najbolj zanimivih metod v tem razredu, razvrščenih po namenu:

Metode za delo z nizi
Metoda Struktura in preobremenitve Namen
Primerjava nizov
primerjaj() public static int Compare(string strA, string strB)

Public static int Compare(string strA, string strB, bool ignoreCase)

Public static int Compare(string strA, string strB, StringComparison comparisonType)

Public static int Compare(string strA, string strB, bool ignoreCase, CultureInfo kultura)

Statična metoda primerja niz strA z nizom strB. Vrne pozitivno vrednost, če je strA večji od strB; negativno, če je strA manjši od strB; in nič, če sta niza strA in strB enaka. Primerjave so narejene na podlagi registra in kulture.

Če je ignoreCase ocenjen kot true, primerjava ne upošteva razlik med velikimi in malimi črkami. Sicer pa se te razlike upoštevajo.

ParameterComparationType določa poseben način primerjave nizov. Razred CultureInfo je definiran v imenskem prostoru 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 comparisonType)

Public static int Compare(string strA, int indexA, string strB, int indexB, int length, bool ignoreCase, CultureInfo culture)

Primerja dele nizov strA in strB. Primerjava se začne z elementoma niza strA in strB in vključuje število znakov, ki jih določa parameter dolžine. Metoda vrne pozitivno vrednost, če je del niza strA večji od dela niza strB; negativna vrednost, če je del niza strA manjši od dela niza strB; in nič, če sta primerjana dela nizov strA in strB enaka. Primerjave so narejene na podlagi registra in kulture.

CompareOrdinal() public static int CompareOrdinal(string strA, string strB)

Javni statični int CompareOrdinal(niz strA, int indeksA, niz strB, int indeksB, int štetje)

Dela isto kot metoda Compare(), vendar brez upoštevanja lokalnih nastavitev

Primerjaj z () public int CompareTo(vrednost predmeta)

Primerja klicni niz s predstavitvijo niza predmeta vrednosti. Vrne pozitivno vrednost, če je klicni niz večji od vrednosti; negativno, če je klicni niz manjši od vrednosti; in nič, če sta primerjana niza enaka

public int CompareTo(string strB)

Primerja klicni niz z nizom strB

je enako() javna preglasitev bool Equals(objekt obj)

Vrne logično vrednost true, če klicni niz vsebuje isto zaporedje znakov kot predstavitev niza obj. Izvaja vrstniško primerjavo, ki razlikuje med velikimi in malimi črkami, vendar kulturno neobčutljiva

public bool Equals (vrednost niza)

Public bool Equals(string value, StringComparison comparisonType)

Vrne logično vrednost true, če klicni niz vsebuje isto zaporedje znakov kot vrednost niza. Izvedena je vrstna primerjava, ki je občutljiva na velike in male črke, vendar ni kulturno občutljiva. ParameterComparationType določa poseben način primerjave nizov

javni statični bool Enako (niz a, niz b)

Javni statični bool Equals(string a, string b, StringComparison exampleType)

Vrne logično vrednost true, če niz a vsebuje isto zaporedje znakov kot niz b. Izvedena je vrstna primerjava, ki je občutljiva na velike in male črke, vendar ni kulturno občutljiva. ParameterComparationType določa poseben način primerjave nizov

Verjenje (povezovanje) nizov
Concat() javni statični niz Concat(niz str0, niz str1);

javni statični niz Concat(vrednosti niza params);

Združi posamezne primerke nizov v en sam niz (veriženje)
Iskanje v nizu
Vsebuje() javni bool Vsebuje (vrednost niza) Metoda, ki vam omogoča, da ugotovite, ali niz vsebuje določen podniz (vrednost)
Začne se z() public bool StartsWith(vrednost niza)

Public bool StartsWith(vrednost niza, Primerjava nizovVrsta primerjave)

Vrne logično vrednost true, če se klicni niz začne z vrednostjo podniza. V nasprotnem primeru je vrnjena logična vrednost false. ParameterComparationType podaja poseben način izvajanja iskanja

EndsWith() public bool EndsWith(vrednost niza)

Public bool EndsWith(vrednost niza, vrsta primerjave nizov)

Vrne logično vrednost true, če se klicni niz konča z vrednostjo podniza. V nasprotnem primeru vrne logično vrednost false. ParameterComparationType podaja posebno metodo iskanja

Indeks() public int IndexOf(char value)

Javno int IndexOf(vrednost niza)

Poišče prvo pojavitev danega podniza ali znaka v nizu. Če iskani znak ali podniz ni najden, je vrnjena vrednost -1.

public int IndexOf(char value, int startIndex)

Public int IndexOf(vrednost niza, int startIndex)

Public int IndexOf(char value, int startIndex, int count)

Public int IndexOf(vrednost niza, int startIndex, int count)

Vrne indeks prve pojavitve vrednosti znaka ali podniza v klicnem nizu. Iskanje se začne pri elementu, ki ga določa startIndex, in obsega število elementov, ki jih določa count (če je navedeno). Metoda vrne -1, če iskani znak ali podniz ni najden

LastIndexOf() Preobremenjene različice so podobne metodi IndexOf().

Enako kot IndexOf, vendar najde zadnji pojavitev znaka ali podniza, ne prvega

IndexOfAny() public int IndexOfAny(char anyOf)

Javno int IndexOfAny(char anyOf, int startIndex)

Public int IndexOfAny(char anyOf, int startIndex, int count)

Vrne indeks prve pojavitve katerega koli znaka iz matrike anyOf, najdene v klicnem nizu. Iskanje se začne pri elementu, ki ga določa startIndex, in zajema število elementov, ki jih določa count (če je navedeno). Metoda vrne -1, če se ne ujema noben znak v matriki anyOf. Iskanje poteka na redni način

LastIndexOfAny Preobremenjene različice so podobne metodi IndexOfAny().

Vrne indeks zadnje pojavitve katerega koli znaka iz matrike anyOf, najdenega v klicnem nizu

Razdelitev in spajanje nizov
Split javni niz Split (params ločilo znakov)

Razcep javnega niza (params ločilo znakov, int count)

Metoda, ki vrne matriko nizov s podnizi, prisotnimi v tem primeru znotraj, ki so med seboj ločeni z elementi iz podane matrike char ali nizov.

V prvi obliki metode Split() je klicni niz razdeljen na sestavne dele. Rezultat je matrika, ki vsebuje podnize, pridobljene iz klicnega niza. Znaki, ki ločujejo te podnize, so posredovani v nizu ločil. Če je niz ločil prazen ali se nanaša na prazen niz, se kot ločilo podniza uporabi presledek. In v drugi obliki te metode je vrnjeno število podnizov, določenih s parametrom štetja.

javni niz Split (params ločilo znakov, možnosti StringSplitOptions)

Javni razdelek niza (ločilo nizov, možnosti StringSplitOptions)

Javni razdelek niza (parametri, ločilo znakov, int count, možnosti StringSplitOptions)

Javni razdelek niza (ločilo nizov, int count, možnosti StringSplitOptions)

V prvih dveh oblikah metode Split() je klicni niz razdeljen na dele in vrnjena je matrika, ki vsebuje podnize, pridobljene iz klicnega niza. Znaki, ki ločujejo te podnize, se posredujejo v nizu ločil. Če je niz ločil prazen, se kot ločilo uporabi presledek. In v tretji in četrti obliki te metode je vrnjeno število vrstic, omejenih s parametrom štetja.

Toda v vseh obrazcih parameter možnosti določa poseben način za obravnavanje praznih vrstic, ki nastanejo, ko sta dve ločili sosednji. Naštevanje StringSplitOptions definira samo dve vrednosti: Noben in RemoveEmptyEntries. Če je možnost None, so prazni nizi vključeni v končni rezultat razdelitve izvirnega niza. In če je parameter možnosti nastavljen na RemoveEmptyEntries, so prazne vrstice izključene iz končnega rezultata razdelitve izvirnega niza.

pridruži se() javni statični niz Join (ločilo niza, vrednost niza)

Javni statični niz Join (ločilo nizov, vrednost niza, int startIndex, int count)

Konstruira nov niz s kombiniranjem vsebine niza nizov.

Prva oblika metode Join() vrne niz, sestavljen iz povezanih podnizov, posredovanih v matriki vrednosti. Drugi obrazec prav tako vrne niz, sestavljen iz podnizov, posredovanih v matriki vrednosti, vendar so združeni v določenem številu, začenši z elementom matrike vrednosti. V obeh oblikah je vsaka naslednja vrstica ločena od prejšnje vrstice z ločilno črto, določeno s parametrom separator.

Vrvice za polnjenje in obrezovanje
Obrezovanje() javni niz Trim()

Javni niz Trim (params char trimChars)

Metoda, ki vam omogoča, da odstranite vse pojavitve določenega niza znakov z začetka in konca trenutne vrstice.

Prva oblika metode Trim() odstrani začetne in končne presledke iz klicnega niza. In druga oblika te metode odstrani začetne in končne pojavitve klicnega niza znakov iz matrike trimChars. Oba obrazca vrneta nastali niz.

PadLeft() javni niz PadLeft(int totalWidth)

Javni niz PadLeft(int totalWidth, char paddingChar)

Omogoča vam, da na levi strani obpolnite niz z znaki.

Prva oblika metode PadLeft() uvede presledke na levi strani klicnega niza, tako da njegova skupna dolžina postane enaka vrednosti parametra totalWidth. In v drugi obliki te metode se znaki, označeni s parametrom paddingChar, vnesejo na levi strani klicnega niza, tako da njegova skupna dolžina postane enaka vrednosti parametra totalWidth. Oba obrazca vrneta nastali niz. Če je vrednost parametra totalWidth manjša od dolžine klicnega niza, se vrne kopija nespremenjenega klicnega niza.

PadRight() Enako kot PadLeft()

Omogoča dodajanje niza z znaki na desni strani.

Vstavljanje, brisanje in zamenjava vrstic
Vstavi() javni niz Insert(int startIndex, vrednost niza)

Uporablja se za vstavljanje ene vrstice v drugo, kjer vrednost označuje vrstico, ki bo vstavljena v klicno vrstico pri startIndex. Metoda vrne nastali niz.

Odstrani() javni niz Odstrani(int startIndex)

Javni niz Odstrani (int startIndex, int count)

Uporablja se za odstranitev dela niza. V prvi obliki metode Remove() se odstranitev začne na mestu, ki ga označuje startIndex, in se nadaljuje do konca vrstice. In v drugi obliki te metode se število znakov, določeno s parametrom štetja, odstrani iz niza, začenši z mesta, ki ga označuje indeks startIndex.

Zamenjati() javni niz Zamenjaj (char oldChar, char newChar)

Javni niz Zamenjaj (niz oldValue, niz newValue)

Uporablja se za zamenjavo dela niza. V prvi obliki metode Replace() so vse pojavitve znaka oldChar v klicnem nizu zamenjane z znakom newChar. In v drugi obliki te metode se vse pojavitve niza oldValue v klicni vrstici nadomestijo z nizom newValue.

Spremeni velike in male črke
ToUpper() javni niz ToUpper()

Vse črke v klicnem nizu naredi z velikimi črkami.

Znižati() javni niz ToLower()

Vse črke v klicnem nizu napišite z malimi črkami.

Pridobivanje podniza iz niza
podniz() javni niz Podniz (int startIndex)

Javni niz Podniz (int startIndex, int length)

V prvi obliki metode Substring() se podniz pridobi z začetkom na lokaciji, ki jo označuje parameter startIndex, in konča na koncu klicnega niza. In v drugi obliki te metode se ekstrahira podniz, sestavljen iz števila znakov, ki jih določa parameter dolžine, začenši z mesta, ki ga označuje parameter startIndex.

Naslednji primer programa uporablja več zgornjih metod:

Uporaba sistema; z uporabo System.Collections.Generic; z uporabo System.Linq; z uporabo System.Text; namespace ConsoleApplication1 ( class Program ( static void Main(string args) ( // Primerjaj prvi dve vrstici string s1 = "to je niz"; niz s2 = "to je besedilo in to je niz"; if (String. CompareOrdinal(s1, s2) != 0) Console.WriteLine("Niz s1 in s2 nista enaka"); if (String.Compare(s1, 0, s2, 13, 10, true) == 0) Console.WriteLine ("Vendar vsebujejo isto besedilo"); // Veženje nizov Console.WriteLine(String.Concat("\n" + "One, two ","three, four")); // Iskanje v nizu / / Prva pojavitev podniza if (s2. IndexOf("this") != -1) Console.WriteLine("Beseda \"this\" najdena v vrstici, je "+ "na: (0) položaju" , s2.IndexOf("this")); // Zadnja pojavitev podniza if (s2.LastIndexOf("this") != -1) Console.WriteLine("Zadnja pojavitev besede \"this\" je " + "na (0) položaju", s2.LastIndexOf("this" )); // Iskanje iz niza znakov char myCh = ("ы","x","t"); if (s2.IndexOfAny (myCh) != -1) Console.WriteLine("Eden od znakov iz niza ch "+ "najden v trenutni vrstici na položaju (0)", s2.IndexOfAny(myCh)); // Ugotovi, ali se vrstica začne z danim podnizom if (s2.StartsWith("to je besedilo") == true) Console.WriteLine("Podniz najden!"); // Ugotovite, ali niz vsebuje podniz // z uporabo primera določanja niza OS uporabnika myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Vaš operacijski sistem je Windows XP"); else if (myOS.Contains("NT 6.1")) Console.WriteLine("Vaš operacijski sistem je Windows 7"); Console.ReadLine(); ) ) )

Nekaj ​​o primerjavi nizov v C#

Verjetno najpogostejša od vseh operacij znakovnega niza je primerjava enega niza z drugim. Preden si ogledamo katero koli metodo primerjave nizov, je vredno poudariti naslednje: primerjave nizov je mogoče izvesti v .NET Framework na dva glavna načina:

    Prvič, primerjava lahko odraža navade in norme določenega kulturnega okolja, ki so pogosto kulturna okolja, ki pridejo v poštev, ko se program izvaja. To je standardno vedenje za nekatere, vendar ne za vse primerjalne metode.

    In drugič, primerjavo je mogoče narediti ne glede na kulturne nastavitve samo z vrstnimi vrednostmi znakov, ki sestavljajo niz. Na splošno nekulturne primerjave nizov uporabljajo leksikografski vrstni red (in jezikovne značilnosti), da ugotovijo, ali je en niz večji, manjši ali enak drugemu nizu. Pri ordinalni primerjavi so nizi preprosto razvrščeni glede na nespremenjeno vrednost vsakega znaka.

Zaradi razlik v načinu, na katerega se primerjave kulturnih nizov in ordinalnih primerjav razlikujejo, ter zaradi posledic vsake take primerjave močno priporočamo, da upoštevate najboljše prakse, ki jih trenutno ponuja Microsoft. Navsezadnje lahko izbira napačne metode za primerjavo nizov povzroči nepravilno delovanje programa, če ta deluje v okolju, ki se razlikuje od tistega, v katerem je bil razvit.

Izbira načina primerjave znakovnih nizov je zelo pomembna odločitev. Kot splošno pravilo in brez izjeme se morate odločiti za primerjavo nizov na kulturno občutljiv način, če je to storjeno z namenom prikaza rezultata uporabniku (na primer za prikaz niza nizov, razvrščenih po leksikografskem vrstnem redu). Če pa nizi vsebujejo fiksne informacije, ki niso namenjene spreminjanju zaradi kulturnih razlik, kot je ime datoteke, ključna beseda, naslov spletnega mesta ali varnostna vrednost, potem morate izbrati ordinalno primerjavo nizov. Seveda bodo značilnosti določene aplikacije, ki se razvija, narekovale izbiro ustrezne metode za primerjavo znakovnih nizov.

Razred String ponuja različne metode primerjave nizov, ki so navedene v zgornji tabeli. Najbolj univerzalna med njimi je metoda Compare(). Omogoča primerjavo dveh nizov v celoti ali delno, občutljivo na velike ali male črke, na način, ki ga določa parameter tipa StringComparison, kot tudi kulturne informacije, ki jih zagotavlja parameter tipa KulturaInfo.

Tiste preobremenitve metode Compare(), ki ne vključujejo parametra tipa StringComparison, izvajajo primerjavo znakovnih nizov glede na velike in male črke ter kulturo. In v tistih preobremenjenih različicah, ki ne vsebujejo parametra tipa CultureInfo, so informacije o kulturnem okolju določene s trenutnim okoljem izvajanja.

Vrsta StringComparison je oštevilčenje, ki definira vrednosti, prikazane v spodnji tabeli. Z uporabo teh vrednosti lahko ustvarite primerjave nizov, ki ustrezajo potrebam vaše posebne aplikacije. Zato dodajanje parametra tipa StringComparison razširi zmožnosti metode Compare() in drugih primerjalnih metod, kot je Equals(). To tudi omogoča, da nedvoumno navedete, kako naj se nizi primerjajo.

Zaradi razlik med kulturno občutljivimi primerjavami nizov in ordinalnimi primerjavami je pomembno, da smo v zvezi s tem čim bolj natančni.

Vrednosti, definirane v oštevilčevanju StringComparison
Pomen Opis
CurrentCulture Primerjave nizov so narejene z uporabo trenutnih nastavitev kulturnega okolja
CurrentCultureIgnoreCase Primerjave nizov so narejene z uporabo trenutnih nastavitev kulture, vendar ne razlikujejo med velikimi in malimi črkami
InvariantCulture Primerjave nizov se izvajajo z uporabo nespremenljivih, tj. univerzalne podatke o kulturnem okolju
InvariantCultureIgnoreCase Primerjave nizov se izvajajo z uporabo nespremenljivih, tj. univerzalni kulturni podatki in ne razlikujejo med velikimi in malimi črkami
Vrstni red Primerjave nizov so narejene z uporabo rednih vrednosti znakov v nizu. V tem primeru se lahko poruši leksikografski red in se ne upoštevajo konvencije, sprejete v določenem kulturnem okolju.
OrdinalIgnoreCase Primerjave nizov so narejene z uporabo vrstnih vrednosti znakov v nizu, vendar niso občutljive na velike in male črke

V vsakem primeru vrne metoda Compare() negativno vrednost, če je prvi primerjani niz manjši od drugega; pozitivno, če je prvi primerjani niz večji od drugega; in nazadnje nič, če sta oba primerjana niza enaka. Čeprav metoda Compare() vrne nič, če so nizi, ki jih primerjamo, enaki, je na splošno bolje uporabiti metodo Equals() ali operator ==, da ugotovimo, ali so nizi znakov enaki.

Dejstvo je, da metoda Compare() določa enakost primerjanih nizov glede na njihov vrstni red. Če torej med nizi opravimo kulturno primerjavo, sta lahko oba niza enaka v svojem razvrstitvenem vrstnem redu, nista pa vsebinsko enaka. Enakost nizov je privzeto določena v metodi Equals() na podlagi rednih vrednosti znakov in brez upoštevanja kulturnega okolja. Zato se v tej metodi privzeto primerjata oba niza za absolutno enakost znakov za znaki, podobno kot se to naredi v operatorju ==.

Kljub veliki vsestranskosti metode Compare() je za preproste ordinalne primerjave znakovnih nizov lažje uporabiti metodo CompareOrdinal(). Na koncu ne pozabite, da metoda CompareTo() izvaja samo kulturno občutljive primerjave nizov.

Naslednji program prikazuje uporabo metod Compare(), Equals(), CompareOrdinal() ter operatorjev == in != za primerjavo znakovnih nizov. Upoštevajte, da prva dva primerjava primerjav jasno prikazujeta razlike med kulturno občutljivimi primerjavami nizov in ordinalnimi primerjavami v angleško govorečem okolju:

Uporaba sistema; Primer razreda ( statični void Main() ( niz str1 = "alfa"; niz str2 = "Alfa"; niz str3 = "Beta"; niz str4 = "alfa"; niz str5 = "alfa, beta"; int rezultat; / / Najprej pokažite razlike med kulturno občutljivo primerjavo nizov // in ordinalno primerjavo rezultat = String.Compare(str1, str2, StringComparison.CurrentCulture); Console.Write("Kulturno občutljiva primerjava nizov: "); if (rezultat 0 ) Console.WriteLine(str1 + " večji od " + str2); sicer Console.WriteLine(str1 + " enako " + str2); rezultat = String.Compare(str1, str2, StringComparison.Ordinal); Console.Write(" Redne primerjalne vrstice: "); if (rezultat 0) Console.WriteLine(str1 + " večji od " + str2); else Console.WriteLine(str1 + " enako " + str4); // Uporabi rezultat metode CompareOrdinal() = String.CompareOrdinal( str1, str2); Console.Write("Primerjanje nizov z uporabo metode CompareOrdinal():\n"); if (rezultat 0) Console.WriteLine(str1 + " večje od " + str2); else Console .WriteLine(str1 + " enako " + str4); Console.WriteLine(); // Ugotavljanje enakosti nizov z uporabo == operatorja // To je ordinalna primerjava znakovnih nizov if (str1 == str4) Console.WriteLine(str1 + " == " + str4); // Definirajte neenakost črte z uporabo operatorja != if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Console.WriteLine(); // Izvedite redno primerjavo nizov, ki ne razlikuje med velikimi in velikimi črkami // z uporabo metode Equals() if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Primerjava nizov z uporabo metode Equals() z " + "Parameter OrdinalIgnoreCase: \n" + str1 + " je enako " + str2); Console.WriteLine(); // Primerjaj dele nizov if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Primerjaj nize ob upoštevanju trenutnega kulturnega okolja:" + "\n3 prvi znaki niza " + str2 + " več kot prvi 3 znaki vrstice " + str5); ) ) )

Zagon tega programa ustvari naslednje rezultate:

Začasno ustavite AdBlock na tem spletnem mestu.

Torej, nizi v jeziku C. Zanje ni ločenega podatkovnega tipa, kot je storjeno v mnogih drugih programskih jezikih. V jeziku C je niz niz znakov. Za označevanje konca vrstice se uporablja znak "\0", o katerem smo razpravljali v zadnjem delu te lekcije. Nikakor ni prikazan na zaslonu, zato si ga ne boste mogli ogledati.

Ustvarjanje in inicializacija niza

Ker je niz niz znakov, sta deklaracija in inicializacija niza podobni podobnim operacijam z enodimenzionalnimi nizi.

Naslednja koda ponazarja različne načine inicializacije nizov.

Seznam 1.

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

Slika 1 Deklaracija in inicializacija nizov

V prvi vrstici preprosto deklariramo niz desetih znakov. Pravzaprav niti ni niz, ker ... v njem ni ničelnega znaka \0, za zdaj je le nabor znakov.

Druga vrstica. Najenostavnejši način neposredne inicializacije. Vsak simbol deklariramo posebej. Glavna stvar pri tem je, da ne pozabite dodati ničelnega znaka \0.

Tretja vrstica je analogna drugi vrstici. Bodite pozorni na sliko. Ker V vrstici na desni je manj znakov, kot je elementov v matriki, preostali elementi bodo zapolnjeni z \0.

Četrta vrstica. Kot lahko vidite, tukaj ni navedena nobena velikost. Program ga bo samodejno izračunal in ustvaril niz znakov zahtevane dolžine. V tem primeru bo ničelni znak \0 vstavljen zadnji.

Kako izpisati niz

Razširimo zgornjo kodo v polnopravni program, ki bo prikazal ustvarjene vrstice na zaslonu.

Seznam 2.

#vključi int main(void) ( char str; char str1 = ("Y","o","n","g","C","o","d","e","r"," \0"); char str2 = "Pozdravljeni!"; char str3 = "Pozdravljeni!"; for(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; }


Sl.2 Različni načini prikaza niza na zaslonu

Kot lahko vidite, obstaja več osnovnih načinov za prikaz niza na zaslonu.

  • uporabite funkcijo printf z specifikatorjem %s
  • uporabite funkcijo puts
  • uporabite funkcijo fputs in kot drugi parameter določite standardni tok za izhod kot stdout.

Edina niansa je pri funkcijah puts in fputs. Upoštevajte, da funkcija puts ovije izhod v naslednjo vrstico, funkcija fputs pa ne.

Kot lahko vidite, je zaključek precej preprost.

Vnos nizov

Vnos niza je nekoliko bolj zapleten kot izpis. Najenostavnejši način bi bil naslednji:

Seznam 3.

#vključi int main(void) (char str; gets(str); puts(str); return 0; )

Funkcija gets začasno ustavi program, prebere niz znakov, vnesenih s tipkovnice, in ga postavi v niz znakov, katerega ime se kot parameter posreduje funkciji.
Funkcija gets se konča z znakom, ki ustreza tipki enter in je zapisan v nizu kot ničelni znak.
Ste opazili nevarnost? Če ne, vas bo prevajalnik na to prijazno opozoril. Težava je v tem, da se funkcija gets izklopi šele, ko uporabnik pritisne enter. To je preobremenjeno z dejstvom, da lahko presežemo matriko, v našem primeru - če vnesemo več kot 20 znakov.
Mimogrede, napake prekoračitve medpomnilnika so prej veljale za najpogostejšo vrsto ranljivosti. Še vedno obstajajo, vendar je njihova uporaba za vdiranje v programe postala veliko težja.

Torej, kaj imamo? Imamo nalogo: zapisati niz v matriko omejene velikosti. To pomeni, da moramo nekako nadzorovati število znakov, ki jih vnese uporabnik. In tukaj nam na pomoč priskoči funkcija fgets:

Seznam 4.

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

Funkcija fgets kot vhod sprejme tri argumente: spremenljivko, v katero naj se zapiše niz, velikost niza, ki naj se zapiše, in ime toka, iz katerega se pridobijo podatki za pisanje v niz, v tem primeru stdin. Kot že veste iz lekcije 3, je stdin standardni vhodni tok, običajno povezan s tipkovnico. Sploh ni nujno, da podatki prihajajo iz toka stdin, v prihodnje bomo to funkcijo uporabljali tudi za branje podatkov iz datotek.

Če med izvajanjem tega programa vnesemo niz, daljši od 10 znakov, bo v matriko še vedno zapisano le 9 znakov od začetka in prelom vrstice, bo fgets niz “odrezal” na želeno dolžino.

Upoštevajte, da funkcija fgets ne bere 10 znakov, ampak 9! Kot se spomnimo, je v nizih zadnji znak rezerviran za ničelni znak.

Preverimo. Zaženimo program iz zadnjega seznama. In vnesite vrstico 1234567890. Na zaslonu bo prikazana vrstica 123456789.


Slika 3 Primer funkcije fgets

Postavlja se vprašanje. Kam je izginil deseti lik? In odgovoril bom. Nikamor ni šel, ostaja v vhodnem toku. Zaženite naslednji program.

Seznam 5.

#vključi int main(void) ( char str; fgets(str, 10, stdin); puts(str); int h = 99; printf("do %d\n", h); scanf("%d",&h) ; printf("po %d\n", h); vrni 0; )

Tukaj je rezultat njenega dela.


Slika 4 Neprazen medpomnilnik stdin

Naj razložim, kaj se je zgodilo. Poklicali smo funkcijo fgets. Odprla je vnosni tok in počakala, da vnesemo podatke. S tipkovnico smo vnesli 1234567890\n (\n mislim s pritiskom na tipko Enter). To je šlo v vhodni tok stdin. Funkcija fgets je po pričakovanjih vzela prvih 9 znakov 123456789 iz vhodnega toka, jim dodala ničelni znak \0 in ga zapisala v niz str. V vhodnem toku je še 0\n.

Nato deklariramo spremenljivko h. Njegovo vrednost prikažemo na zaslonu. Nato pokličemo funkcijo scanf. Tu se pričakuje, da lahko nekaj vpišemo, ampak ... v vhodnem toku visi 0\n, potem funkcija scanf to zazna kot naš vnos in zapiše 0 v spremenljivko h. Nato ga prikažemo na zaslonu.

To seveda ni ravno vedenje, ki ga pričakujemo. Da bi se spopadli s to težavo, moramo počistiti vnosni medpomnilnik, potem ko iz njega preberemo uporabnikov vnos. Za to se uporablja posebna funkcija fflush. Ima samo en parameter - tok, ki ga je treba počistiti.

Popravimo zadnji primer, da bo deloval predvidljivo.

Seznam 6.

#vključi int main(void) ( char str; fgets(str, 10, stdin); fflush(stdin); // počisti vhodni tok puts(str); int h = 99; printf("do %d\n", h ) ; scanf("%d",&h); printf("po %d\n", h); vrni 0; )

Zdaj bo program deloval kot mora.


Slika 4 Izpiranje medpomnilnika stdin s funkcijo fflush

Če povzamemo, je mogoče opozoriti na dve dejstvi. najprej Trenutno uporaba funkcije gets ni varna, zato je priporočljiva uporaba funkcije fgets povsod.

drugič Ne pozabite počistiti vnosnega medpomnilnika, če uporabljate funkcijo fgets.

S tem zaključimo pogovor o vnašanju nizov. Kar daj.