Kako postaviti pametne telefone i računala. Informativni portal

Što se podrazumijeva pod stringovima u jeziku C? Operatori klase nizova

U moderni standard C++ definira klasu s funkcijama i svojstvima (varijablama) za organiziranje rada sa stringovima (in klasični jezik Ne postoje nizovi kao takvi, postoje samo nizovi znakova char):

#uključi

#uključi

#uključi

Za rad sa nizovima također morate povezati standardni prostor imena:

Korištenje imenskog prostora std;

U suprotnom ćete svugdje morati navesti deskriptor klase std::string umjesto string.

Ispod je primjer programa koji radi sa stringom (ne radi u starijim C-kompatibilnim prevoditeljima!):

#uključi #uključi #uključi korištenje imenskog prostora std; int main() (string s = "Test"; s.insert(1,"!"); cout<< s.c_str() << endl; string *s2 = new string("Hello"); s2->brisanje(s2->kraj()); cout<< s2->c_str(); cin.get(); povratak 0; )

Glavne karakteristike koje klasa string ima:

  • inicijalizacija s nizom znakova (ugrađeni tip niza) ili drugim objektom tipa niz. Ugrađeni tip nema drugu mogućnost;
  • kopiranje jedne linije u drugu. Za ugrađeni tip morate koristiti funkciju strcpy();
  • Pristup pojedinačni likovi redaka za čitanje i pisanje. U ugrađenom nizu, to se radi pomoću operacije indeksa ili neizravnog adresiranja pomoću pokazivača;
  • uspoređujući dva niza radi jednakosti. Za ugrađeni tip koriste se funkcije obitelji strcmp();
  • ulančavanje (ulančavanje) dva niza, što daje rezultat ili kao treći niz ili umjesto jednog od izvornih. Za ugrađeni tip koristi se funkcija strcat(), ali za dobivanje rezultata nova linija, trebate uzastopno koristiti funkcije strcpy() i strcat(), a također voditi računa o dodjeli memorije;
  • ugrađena sredstva za određivanje duljine niza (funkcije članice klase size() i l ength()). Jedini način da saznate duljinu niza ugrađenog tipa je izračunavanjem pomoću funkcije strlen();
  • sposobnost otkrivanja je li niz prazan.

Razmotrimo ove osnovne sposobnosti u detaljima.

Inicijaliziranje nizova pri opisivanju i duljina niza(ne uključujući završni nulti terminator):

String str("Moj niz\n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";

String također može biti prazan:

Niz st2;

Da to provjerim je li linija prazna, možete usporediti njegovu duljinu s 0:

If (! st.size()) // prazno

ili koristite metodu empty(), koja vraća true za prazan niz i false za neprazan:

If (st.empty()) // prazno

Treći oblik stvaranja niza inicijalizira objekt tipa string drugim objektom istog tipa:

Niz st3(st);

Niz st3 inicijalizira se nizom st. Kako možemo osigurati ove linije se podudaraju? Upotrijebimo operator usporedbe (==):

If (st == st3) // inicijalizacija radi

Kako kopirati jedan redak u drugi? Korištenje normalnog operatora dodjele:

St2 = st3; // kopiraj st3 u st2

Za spajanje nizova koristi se operator zbrajanja (+) ili operator zbrajanja plus dodjeljivanja (+=). Neka su dana dva retka:

Niz s1("zdravo, "); niz s2("svijet\n");

Možemo dobiti treći niz koji se sastoji od ulančavanja prva dva, na ovaj način:

Niz s3 = s1 + s2;

Ako želimo dodati s2 na kraj s1, trebali bismo napisati:

S1 += s2;

Operacija zbrajanja može ulančati objekte klase niz ne samo međusobno, već i s ugrađenim nizovima tipa. Gornji primjer možete prepisati tako da posebni znakovi i interpunkcijski znakovi budu predstavljeni ugrađenim tipom char *, a značajne riječi predstavljene objektima niza klase:

Const char *pc = ", "; niz s1("zdravo"); niz s2("svijet"); niz s3 = s1 + pc + s2 + "\n"; cout<< endl << s3;

Takvi izrazi rade jer prevoditelj "zna" kako automatski pretvoriti objekte ugrađenog tipa u objekte klase string. Također je moguće jednostavno dodijeliti ugrađeni niz string objektu:

Niz s1; const char *pc = "niz znakova"; s1 = pc; // Točno

Inverzna transformacija u ovom slučaju Ne radi. Pokušaj izvođenja sljedeće inicijalizacije niza ugrađenog tipa izazvat će pogrešku kompilacije:

Znak *str = s1; // pogreška kompilacije

Da biste izvršili ovu konverziju, morate eksplicitno pozvati funkciju članicu koja se zove c_str() ("C niz"):

Const char *str = s1.c_str();

Funkcija c_str() vraća pokazivač na niz znakova koji sadrži niz string objekta onako kako bi se pojavio u ugrađenoj vrsti niza. Ključna riječ const ovdje sprječava "opasnu" mogućnost u modernim vizualnim okruženjima izravne izmjene sadržaja objekta putem pokazivača.

DO pojedinačni likovi objektu tipa string, poput ugrađenog tipa, može se pristupiti pomoću operacije indeksa. Na primjer, ovdje je dio koda koji sve točke zamjenjuje podvlakama:

String str("www.disney.com"); int veličina = str.size(); za (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;

Zamijeni(str.begin(), str.end(), ".", "_");

Istina, ovdje se ne koristi metoda zamjene klase nizova, već istoimeni algoritam:

#uključi

Budući da se string objekt ponaša kao spremnik, na njega se mogu primijeniti drugi algoritmi. To vam omogućuje rješavanje problema koji nisu izravno riješeni funkcijama klase nizova.

Ispod je kratak opis glavnih operatora i funkcija klase string; veze u tablici vode do opisa na ruskom jeziku na Internetu. Potpuniji popis mogućnosti klase string može se pronaći, primjerice, na Wikipediji ili na web stranici cplusplus.com.

Linije. Ulaz/izlaz niza. Formatirani I/O. Obrada nizova pomoću standardnih funkcija jezika C. Rad s memorijom.

1.1. Deklaracija i inicijalizacija nizova.

Niz je niz znakova koji završava praznim znakom '\0'. Niz se deklarira kao regularni niz znakova, na primjer,

char s1; // niz od devet znakova

char *s2; // pokazivač na string

Razlika između pokazivača s1 i s2 je u tome što je pokazivač s1 imenovana konstanta, a pokazivač s2 varijabla.

Konstante niza nalaze se u dvostrukim navodnicima, za razliku od znakova koji se nalaze u jednostrukim navodnicima. Na primjer,

"Ovo je niz."

Duljina konstante niza ne smije premašiti 509 znakova prema standardu. Međutim, mnoge implementacije dopuštaju veće duljine niza.

Kada inicijalizirate nizove, bolje je ne specificirati veličinu niza; prevodilac će to učiniti izračunavanjem duljine niza i dodavanjem jednog na njega. Na primjer,

char s1 = “Ovo je niz.”;

U programskom jeziku C postoji velik broj funkcija za rad sa stringovima, čiji su prototipovi opisani u datotekama zaglavlja stdlib.h i string.h. O radu s ovim funkcijama raspravljat ćemo u sljedećim paragrafima.

1.2. Ulaz/izlaz niza.

Za unos niza iz konzole koristite funkciju

char* dobiva(char *str);

koji ispisuje niz na adresu str i vraća adresu upisanog niza. Funkcija zaustavlja unos ako naiđe na znak '\n' ili EOF (kraj datoteke). Znak novog retka se ne kopira. Nulti bajt stavlja se na kraj čitane linije. Ako je uspješna, funkcija vraća pokazivač na pročitani red, a ako ne uspije, vraća NULL.

Za ispis niza u konzolu koristite standardnu ​​funkciju

int stavlja (const char *s);

koji, ako je uspješan, vraća nenegativan broj, a ako je neuspješan, vraća EOF.

Prototipovi funkcija gets i puts opisani su u datoteci zaglavlja stdio.h.

#uključi

printf("Ulazni niz: ");

1.3. Formatirani I/O.

Za formatirani unos podataka iz konzole koristite funkciju

int scanf (const char *format, ...);

koji, ako je uspješan, vraća broj jedinica pročitanih podataka, a ako je neuspješan, vraća EOF. Parametar formata mora ukazivati ​​na niz koji treba formatirati, a koji sadrži specifikacije ulaznog formata. Broj i tipovi argumenata koji slijede niz formata moraju odgovarati broju i vrstama ulaznih formata navedenih u nizu formata. Ako ovaj uvjet nije ispunjen, tada je rezultat funkcije nepredvidiv.

Razmak, "\t" ili "\n" znak u nizu formata opisuje jedan ili više praznih znakova u ulaznom toku, koji uključuje znakove: razmak, '\t', '\n', '\v', '\f'. Funkcija scanf preskače prazne znakove u ulaznom toku.

Doslovni znakovi u nizu formata, s iznimkom znaka %, zahtijevaju da se potpuno isti znakovi pojave u ulaznom toku. Ako nema takvog znaka, funkcija scanf prestaje unositi. Funkcija scanf preskače doslovne znakove.

Općenito, specifikacija ulaznog formata izgleda ovako:

%[*] [širina] [modifikatori] vrsta

Simbol '*' označava izostavljanje pri unosu polja definiranog ovom specifikacijom;

- ‘width’ definira najveći broj znakova unesenih prema ovoj specifikaciji;

Tip može uzeti sljedeće vrijednosti:

c – niz znakova,

s – niz znakova, linije su odvojene praznim znakovima,

d – cijeli broj s predznakom od 10 s/s,

i – cijeli broj s predznakom, brojevni sustav ovisi o prve dvije znamenke,

u – cijeli broj bez predznaka pri 10 s/s,

o – cijeli broj bez predznaka u 8 s/s,

x, X – cijeli broj bez predznaka pri 16 s/s,

e, E, f, g, G – pomični broj,

p – pokazivač na pokazivač,

n – pokazivač na cijeli broj,

[…] – niz skeniranih znakova, na primjer, .

U potonjem slučaju, iz ulaznog toka bit će uneseni samo znakovi u uglatim zagradama. Ako je prvi znak unutar uglatih zagrada '^', tada se unose samo oni znakovi koji nisu u nizu. Raspon znakova u nizu naveden je pomoću simbola '-'. Kada unesete znakove, također se unose početni prazni znakovi i završni nulti bajt niza.

Modifikatori mogu imati sljedeće vrijednosti:

h – kratki cijeli broj,

l, L – dugi cijeli broj ili plutajući,

i koriste se samo za cijele ili pokretne brojeve.

Sljedeći primjer pokazuje upotrebu funkcije scanf. Imajte na umu da specifikatoru formata, počevši s unosom plutajućeg broja, prethodi znak razmaka.

#uključi

printf("Unesite cijeli broj: ");

scanf("%d", &n);

printf("Unesite dvostruko: ");

scanf(" %lf", &d);

printf("Unesite znak: ");

scanf(" %c", &c);

printf("Unesite niz: ");

scanf(" %s", &s);

Imajte na umu da se u ovom programu inicijalizira broj s pomičnim zarezom. To je učinjeno tako da prevoditelj uključuje biblioteku za podršku rada s pokretnim brojevima. Ako se to ne učini, pojavit će se pogreška tijekom izvođenja prilikom unosa plutajućeg broja.

Za formatirani izlaz podataka na konzolu koristite funkciju

int printf (const char *format, ...);

koji, ako je uspješan, vraća broj jedinica izlaza podataka, a ako je neuspješan, vraća EOF. Parametar formata je niz formata koji sadrži specifikacije za izlazne formate. Broj i tipovi argumenata koji slijede niz formata moraju odgovarati broju i tipovima specifikacija izlaznog formata navedenim u nizu formata. Općenito, specifikacija izlaznog formata izgleda ovako:

%[flags] [width] [.precision] [modifiers] tip

- ‘zastavice’ su različiti simboli koji određuju izlazni format;

- 'width' definira minimalni broj znakova u izlazu prema ovoj specifikaciji;

- ‘.precision’ definira najveći broj prikazanih znakova;

- 'modifikatori' određuju vrstu argumenata;

- 'type' specificira tip argumenta.

Za ispis cijelih brojeva s predznakom koristi se sljedeći izlazni format:

%[-] [+ | prostor] [širina] [l] d

- – poravnanje lijevo, zadano – desno;

+ – prikazuje se znak ‘+’, imajte na umu da se za negativne brojeve uvijek prikazuje znak ‘-’;

‘razmak’ – razmak se prikazuje na poziciji znaka;

d – tip podataka int.

Za ispis nepredznačenih cijelih brojeva koristite sljedeći izlazni format:

%[-] [#] [širina] [l]

# – početna 0 izlazi za brojeve u 8 c/c ili početna 0x ili 0X za brojeve u 16 c/c,

l – modifikator dugog tipa podataka;

u – cijeli broj u 10c/c,

o – cijeli broj u 8 c/c,

x, X – cijeli broj na 16 c/c.

Za ispis brojeva s pomičnim zarezom koristi se sljedeći izlazni format:

%[-] [+ | prostor] [širina] [.preciznost]

"preciznost" - označava broj znamenki iza decimalne točke za formate f, e i E ili broj značajnih znamenki za formate g i G. Brojevi se zaokružuju. Zadana preciznost je šest decimalnih znamenki;

f – broj fiksne točke,

e – broj u eksponencijalnom obliku, eksponent se označava slovom “e”,

E – broj u eksponencijalnom obliku, eksponent se označava slovom “E”,

g – najkraći od f ili g formata,

G – najkraći od f ili G formata.

printf ("n = %d\n f = %f\n e = %e\n E = %E\n f = %.2f", -123, 12.34, 12.34, 12.34, 12.34);

// ispisuje: n = 123 f = 12,340000 e = 1,234000e+001 E = 1,234000E+001 f = 12,34

1.4. Oblikovanje nizova.

Postoje varijante funkcija scanf i printf koje su dizajnirane za formatiranje nizova i nazivaju se sscanf odnosno sprintf.

int sscanf (const char *str, const char *format, ...);

čita podatke iz niza navedenog pomoću str, prema nizu formata određenom pomoću format. Ako je uspješno, vraća broj pročitanih podataka, a ako je neuspješno, vraća EOF. Na primjer,

#uključi

char str = "a 10 1.2 Niz bez unosa";

sscanf(str, "%c %d %lf %s", &c, &n, &d, s);

printf("%c\n", c); // ispisuje: a

printf("%d\n", n); // ispisuje: 10

printf("%f\n", d); // ispisuje: 1.200000

printf("%s\n", s); // ispisuje: String

int sprintf (char *buffer, const char *format, ...);

formatira niz u skladu s formatom navedenim parametrom formata i zapisuje rezultirajući rezultat u međuspremnik niza znakova. Funkcija vraća broj znakova upisanih u međuspremnik niza znakova, isključujući završni nulti bajt. Na primjer,

#uključi

char str = "c = %c, n = %d, d = %f, s = %s";

char s = "Ovo je niz.";

sprintf(međuspremnik, str, c, n, d, s);

printf("%s\n", međuspremnik); // ispisuje: c = c, n = 10, d = 1,200000, s = Ovo je niz

1.5. Pretvorite nizove u numeričke podatke.

Prototipovi funkcija za pretvaranje nizova u numeričke podatke dani su u datoteci zaglavlja stdlib.h, koja mora biti uključena u program.

Za pretvaranje niza u cijeli broj upotrijebite funkciju

int atoi (const char *str);

char *str = “-123”;

n = atoi(str); // n = -123

Za pretvaranje niza u dugi cijeli broj upotrijebite funkciju

long int atol (const char *str);

koji, ako je uspješan, vraća cijeli broj u koji je string pretvoren, a ako je neuspješan, vraća 0. Na primjer,

char *str = “-123”;

n = atol(str); // n = -123

Za pretvaranje niza u dvostruki broj upotrijebite funkciju

dvostruko atof(const char *str);

koji, ako je uspješan, vraća plutajući broj tipa double, u koji se pretvara niz str, a ako ne uspije, vraća 0. Na primjer,

char *str = “-123.321”;

n = atof(str); // n = -123,321

Sljedeće funkcije izvode slične funkcije kao atoi, atol, atof, ali pružaju napredniju funkcionalnost.

long int strtol (const char *str, char **endptr, int base);

pretvara niz str u dugi int broj, koji vraća. Parametri ove funkcije imaju sljedeće svrhe.

Ako je baza 0, tada pretvorba ovisi o prva dva znaka str:

Ako je prvi znak broj od 1 do 9, tada se pretpostavlja da je broj predstavljen u 10 c/c;

Ako je prvi znak znamenka 0, a drugi znak znamenka od 1 do 7, tada se pretpostavlja da je broj predstavljen u 8 c/c;

Ako je prvi znak 0, a drugi 'X' ili 'x', tada se pretpostavlja da je broj predstavljen u 16 c/c.

Ako je baza broj između 2 i 36, tada se ta vrijednost uzima kao baza brojevnog sustava, a bilo koji znak izvan brojevnog sustava prestaje se pretvarati. U brojevnim sustavima od baze 11 do baze 36, simboli 'A' do 'Z' ili 'a' do 'z' koriste se za predstavljanje znamenki.

Vrijednost argumenta endptr postavlja funkcija strtol. Ova vrijednost sadrži pokazivač na znak koji je spriječio pretvaranje niza str. Funkcija strtol vraća pretvoreni broj ako je uspješna, a 0 ako je neuspješna.

n = strtol ("12a", &p, 0);

printf("n = %ld, %stop = %c, n, *p); // n = 12, stop = a

n = strtol("012b", &p, 0);

printf("n = %ld, %stop = %c, n, *p); // n = 10, stop = b

n = strtol ("0x12z", &p, 0);

printf("n = %ld, %stop = %c, n, *p); // n = 18, stop = z

n = strtol ("01117", &p, 0);

printf("n = %ld, %stop = %c, n, *p); // n = 7, stop = 7

unsigned long int strtol (const char *str, char **endptr, int base);

radi slično funkciji strtol, ali pretvara simboličku reprezentaciju broja u broj tipa unsigned long int.

dvostruki strtod (const char *str, char **endptr);

Pretvara simbolički prikaz broja u dvostruko.

Sve funkcije navedene u ovom paragrafu prestaju raditi kada naiđu na prvi znak koji ne odgovara formatu dotičnog broja.

Osim toga, ako vrijednost znaka broja premašuje raspon prihvatljivih vrijednosti za odgovarajući tip podataka, tada funkcije atof, strtol, strtoul, strtod postavljaju vrijednost errno varijable na ERANGE. Varijabla errno i konstanta ERANGE definirane su u datoteci zaglavlja math.h. U ovom slučaju, funkcije atof i strtod vraćaju vrijednost HUGE_VAL, funkcija strtol vraća vrijednost LONG_MAX ili LONG_MIN, a funkcija strtoul vraća vrijednost ULONG_MAX.

Nestandardne funkcije itoa, ltoa, utoa, ecvt, fcvt i gcvt mogu se koristiti za pretvaranje numeričkih podataka u znakovne nizove. Ali bolje je koristiti standardnu ​​funkciju sprintf za ove svrhe.

1.6. Standardne funkcije za rad sa stringovima.

Ovaj odjeljak govori o funkcijama za rad s nizovima, čiji su prototipovi opisani u datoteci zaglavlja string.h.

1. Usporedba nizova. Funkcije strcmp i strncmp koriste se za usporedbu nizova.

int strcmp (const char *str1, const char *str2);

leksikografski uspoređuje nizove str1, str2 i vraća –1, 0 ili 1 ako je str1 manji, jednak ili veći od str2.

int strncmp (const char *str1, const char *str2, size_t n);

leksikografski uspoređuje najviše prvih n znakova iz nizova str1 i str2. Funkcija vraća -1, 0 ili 1 ako je prvih n znakova iz str1 manje, jednako ili veće od prvih n znakova iz str2.

// primjer usporedbe stringova

#uključi

#uključi

char str1 = "aa bb";

char str2 = "aa aa";

char str3 = "aa bb cc";

printf("%d\n", strcmp(str1, str3)); // ispisuje: -1

printf("%d\n", strcmp(str1, str1)); // ispisuje: -0

printf("%d\n", strcmp(str1, str2)); // ispisuje: 1

printf("%d\n", strncmp(str1, str3, 5)); // ispisuje: 0

2. Kopiranje linija. Funkcije strcpy i strncpy koriste se za kopiranje nizova.

char *strcpy (char *str1, const char *str2);

kopira niz str2 u niz str1. Kopira se cijeli niz str2, uključujući završni nulti bajt. Funkcija vraća pokazivač na str1. Ako se linije preklapaju, rezultat je nepredvidiv.

char *strncpy (char *str1, const char *str2, veličina_t n);

kopira n znakova iz niza str2 u niz str1. Ako str2 sadrži manje od n znakova, tada se posljednji nulti bajt kopira onoliko puta koliko je potrebno da se str2 proširi na n znakova. Funkcija vraća pokazivač na string str1.

char str2 = "Kopiraj niz.";

strcpy(str1, str2);

printf(str1); // ispisuje: Kopiraj niz.

4. Povezivanje nizova. Funkcije strcat i strncat koriste se za spajanje nizova u jedan niz.

char* strcat (char *str1, const char *str2);

dodaje string str2 nizu str1, pri čemu se zadnji nulti bajt niza str1 briše. Funkcija vraća pokazivač na string str1.

char* strncat (char *str1, const char *str2, size_t n);

dodaje n znakova iz niza str2 u niz str1, pri čemu se zadnji nulti bajt niza str1 briše. Funkcija vraća pokazivač na string str1. ako je duljina niza str2 manja od n, tada se dodaju samo znakovi uključeni u niz str2. Nakon ulančavanja nizova, str1 se uvijek dodaje nulti bajt. Funkcija vraća pokazivač na string str1.

#uključi

#uključi

char str1 = "Niz";

char str2 = "katenacija";

char str3 = "Da Ne";

strcat(str1, str2);

printf("%s\n", str1); // ispisuje: katenacija niza

strncat(str1, str3, 3);

printf("%s\n", str1); // ispisuje: Katetacija niza Da

5. Potražite znak u nizu. Za traženje znaka u nizu koristite funkcije strchr, strrchr, strspn, strcspn i strpbrk.

char* strchr (const char *str, int c);

traži prvo pojavljivanje znaka navedenog sa c u nizu str. Ako je uspješna, funkcija vraća pokazivač na prvi pronađeni znak, a ako ne uspije, vraća NULL.

char* strrchr (const char *str, int c);

traži zadnje pojavljivanje znaka navedenog sa c u nizu str. Ako je uspješna, funkcija vraća pokazivač na posljednji pronađeni znak, a ako ne uspije, vraća NULL.

#uključi

#uključi

char str = "Traži znakove";

printf("%s\n", strchr(str, "r")); // ispisuje: r traži

printf("%s\n", strrchr(str, "r")); // ispisuje: rch

size_t strspn (const char *str1, const char *str2);

vraća indeks prvog znaka iz str1 koji nije u str2.

size_t strcspn (const char *str1, const char *str2);

vraća indeks prvog znaka iz str1 koji se pojavljuje u str2.

char str = "123 abc";

printf ("n = %d\n", strspn (str, "321"); // ispisuje: n = 3

printf ("n = %d\n", strcspn (str, "cba"); // ispisuje: n = 4

char* strpbrk (const char *str1, const char *str2);

pronalazi prvi znak u nizu str1 koji je jednak jednom od znakova u nizu str2. Ako je uspješna, funkcija vraća pokazivač na ovaj znak, a ako ne uspije, vraća NULL.

char str = "123 abc";

printf("%s\n", strpbrk(str, "bca")); // ispisuje: abc

6. Usporedba nizova. Funkcija strstr koristi se za usporedbu nizova.

char* strstr (const char *str1, const char *str2);

pronalazi prvo pojavljivanje str2 (bez nula bajta na kraju) u str1. Ako je uspješna, funkcija vraća pokazivač na pronađeni podniz, a ako ne uspije, vraća NULL. Ako pokazivač str1 pokazuje na niz nulte duljine, tada funkcija vraća pokazivač str1.

char str = "123 abc 456;

printf ("%s\n", strstr (str, "abc"); // ispis: abc 456

7. Raščlanjivanje niza u žetone. Funkcija strtok koristi se za rastavljanje niza u tokene.

char* strtok (char *str1, const char *str2);

vraća pokazivač na sljedeći token (riječ) u nizu str1, u kojem su razdjelnici tokena znakovi iz niza str2. Ako više nema tokena, funkcija vraća NULL. Pri prvom pozivu funkcije strtok, parametar str1 mora ukazivati ​​na string koji je tokeniziran, a pri sljedećim pozivima ovaj parametar mora biti postavljen na NULL. Nakon pronalaska tokena, funkcija strtok zapisuje nulti bajt nakon ovog tokena umjesto graničnika.

#uključi

#uključi

char str = "12 34 ab cd";

p = strtok(str, " ");

printf("%s\n", p); // ispisuje vrijednosti u stupcu: 12 34 ab cd

p = strtok(NULL, " ");

8. Određivanje duljine niza. Funkcija strlen koristi se za određivanje duljine niza.

veličina_t strlen (const char *str);

vraća duljinu niza, zanemarujući zadnji nulti bajt. Na primjer,

char str = "123";

printf("len = %d\n", strlen(str)); // ispisuje: len = 3

1.7. Funkcije za rad s memorijom.

Datoteka zaglavlja string.h također opisuje funkcije za rad s memorijskim blokovima, koje su slične odgovarajućim funkcijama za rad sa stringovima.

void* memchr (const void *str, int c, size_t n);

traži prvo pojavljivanje znaka navedenog sa c u n bajtova niza str.

int memcmp (konst void *str1, konst void *str2, veličina_t n);

uspoređuje prvih n bajtova stringova str1 i str2.

void* memcpy (konst void *str1, konst void *str2, veličina_t n);

kopira prvih n bajtova iz niza str1 u niz str2.

void* memmove (const void *str1, const void *str2, size_t n);

kopira prvih n bajtova iz str1 u str2, osiguravajući da se preklapajućim nizovima ispravno rukuje.

void* memset (const void *str, int c, size_t n);

kopira znak naveden sa c u prvih n bajtova str.

34

--- Vodič za C# --- Nizovi

Sa stajališta uobičajenog programiranja, niz vrsta podataka string jedan je od najvažnijih u C#. Ovaj tip definira i podržava znakovne nizove. U nizu drugih programskih jezika, niz je niz znakova. A u C#, nizovi su objekti. Stoga je tip niza referentni tip.

Izgradnja nizova

Najjednostavniji način konstruiranja znakovnog niza je korištenje string literala. Na primjer, sljedeći redak koda dodjeljuje varijabli string reference str referencu na literal niza:

String str = "Primjer niza";

U ovom slučaju, varijabla str je inicijalizirana nizom znakova "Primjer niza". Objekt tipa string također se može stvoriti iz niza tipa char. Na primjer:

Chararray = ("e", "x", "a", "m", "p", "l", "e"); string str = novi niz(chararray);

Nakon što se objekt niza stvori, može se koristiti bilo gdje gdje trebate niz teksta unutar navodnika.

Postojanost niza

Čudno je da se sadržaj objekta tipa string ne može promijeniti. To znači da jednom kreiran niz znakova ne može se mijenjati. Ali ovo ograničenje doprinosi učinkovitijoj implementaciji nizova znakova. Stoga se ovaj naizgled očiti nedostatak zapravo pretvara u prednost. Stoga, ako je niz potreban kao varijacija postojećeg niza, tada bi se u tu svrhu trebao stvoriti novi niz koji sadrži sve potrebne promjene. A budući da se neiskorišteni string objekti automatski skupljaju kao smeće, ne morate čak ni brinuti o sudbini nepotrebnih stringova.

Međutim, treba naglasiti da su varijabilne reference na stringove (odnosno objekte tipa string) podložne promjenama, te se stoga mogu odnositi na drugi objekt. Ali sadržaj samog string objekta ne mijenja se nakon što je kreiran.

Pogledajmo primjer:

Static void addNewString() ( string s = "Ovo je moj potez"; s = "Ovo je novi potez"; )

Prevedimo aplikaciju i učitajmo rezultirajući sklop u uslužni program ildasm.exe. Slika prikazuje CIL kod koji će se generirati za metodu void addNewString():

Imajte na umu da postoje brojni pozivi operacijskom kodu ldstr (string load). Ovaj opcijski kod CIL ldstr izvodi učitavanje novog objekta niza na upravljanu gomilu. Kao rezultat toga, prethodni objekt koji je sadržavao vrijednost "Ovo je moj udar" na kraju će biti skupljen u smeće.

Rad sa nizovima

U klasi System.String postoji niz metoda za određivanje duljine znakovnih podataka, traženje podniza u trenutnom nizu, pretvaranje znakova iz velikih u mala slova i obrnuto, itd. Zatim ćemo detaljnije pogledati ovu klasu.

Svojstvo klase polja, indeksatora i niza

Klasa String definira jedno polje:

Javni statički niz samo za čitanje Prazan;

Prazno polje označava prazan niz, tj. niz koji ne sadrži nijedan znak. Ovo se razlikuje od prazne reference niza, koja se jednostavno postavlja na nepostojeći objekt.

Osim toga, klasa String definira jedan indekser samo za čitanje:

Javno označi ovo ( get; )

Ovaj indeksator vam omogućuje da dobijete znak na određenom indeksu. Indeksiranje nizova, kao i nizova, počinje od nule. String objekti su postojani i ne mijenjaju se, tako da ima smisla da klasa String podržava indeksiranje samo za čitanje.

Konačno, klasa String definira jedno svojstvo samo za čitanje:

Public int duljina ( get; )

Svojstvo Length vraća broj znakova u nizu. Primjer u nastavku prikazuje upotrebu indeksatora i svojstva Length:

Korištenje sustava; klasa Primjer ( static void Main() ( string str = "Jednostavan niz"; // Dobijte duljinu niza i 6. znak u retku pomoću indeksatora Console.WriteLine("Duljina niza je (0), 6. znak je "(1)"", str.Length, str);

Operatori klase nizova

Klasa String preopterećuje sljedeća dva operatora: == i !=. Operator == koristi se za testiranje jednakosti dva niza znakova. Kada se operator == primijeni na reference objekta, on obično testira jesu li obje reference napravljene na isti objekt. A kada se operator == primijeni na reference na objekte tipa String, sadržaj samih nizova uspoređuje se radi jednakosti. Isto vrijedi i za operator !=. Kada se primjenjuje na reference na objekte tipa String, sadržaj samih nizova uspoređuje se radi nejednakosti. Međutim, drugi relacijski operatori, uključujući =, uspoređuju reference na objekte tipa String na isti način kao što uspoređuju reference na objekte drugih tipova. A da biste provjerili je li jedan niz veći od drugog, trebali biste pozvati metodu Compare() definiranu u klasi String.

Kao što će postati jasno, mnoge vrste usporedbi nizova znakova oslanjaju se na kulturološke informacije. Ali to se ne odnosi na operatore == i !=. Uostalom, oni jednostavno uspoređuju redne vrijednosti znakova u nizovima. (Drugim riječima, oni uspoređuju binarne vrijednosti znakova koji nisu izmijenjeni kulturnim normama, to jest lokalnim standardima.) Stoga ovi operatori izvode usporedbe nizova na način koji ne razlikuje velika i mala slova i kulturu.

Metode klasa nizova

Sljedeća tablica navodi neke od najzanimljivijih metoda u ovoj klasi, grupirane prema namjeni:

Određivanje znakova u nizu

operator=

dodjeljuje vrijednosti nizu

dodijeliti

dodjeljuje znakove nizu

Pristup pojedinačnim znakovima

na

dobivanje navedenog znaka i provjera je li indeks izvan granica

operater

dobivanje navedenog znaka

ispred

dobivanje prvog znaka

leđa

dobivanje posljednjeg znaka

podaci

vraća pokazivač na prvi znak niza

c_str

vraća nepromjenjiv niz C znakova koji sadrži znakove niza

Provjera kapaciteta linije

prazan

provjerava je li niz prazan

veličina
duljina

vraća broj znakova u nizu

najveća_veličina

vraća najveći broj znakova

pričuva

rezervira skladišni prostor

Operacije nizova

čisto

briše sadržaj niza

umetnuti

umetanje znakova

izbrisati

brisanje znakova

odgurnuti

dodavanje znaka na kraj niza

pop_back

uklanja posljednji znak

dodati

operator+=

dodaje znakove na kraj niza

usporediti

uspoređuje dva niza

zamijeniti

zamjenjuje svako pojavljivanje navedenog znaka

substr

vraća podniz

kopirati

kopira znakove

promijeniti veličinu

mijenja broj pohranjenih znakova

C i C++ biblioteka funkcija uključuje bogat skup funkcija za obradu nizova i znakova. Funkcije nizova rade na nizovima znakova koji završavaju nultim znakovima. U jeziku C, da biste koristili funkcije niza, morate uključiti datoteku zaglavlja na početku programskog modula , a za simboličke - datoteku zaglavlja . C++ koristi zaglavlja za rad s funkcijama nizova i znakova I odnosno. Ovo poglavlje koristi nazive C-zaglavlja radi lakše prezentacije.

Budući da jezici C i C++ ne kontroliraju automatski kršenje svojih granica prilikom izvođenja operacija s nizovima, sva odgovornost za prelijevanje nizova pada na ramena programera. Zanemarivanje ovih suptilnosti može dovesti do pada programa.

U C i C++, ispisivi znakovi su znakovi prikazani na terminalu. U ASCII okruženjima nalaze se između razmaka (0x20) i tilde (OxFE). Kontrolni znakovi imaju vrijednosti između nule i Ox1F; oni također uključuju simbol DEL(Ox7F).

Povijesno gledano, argumenti karakternih funkcija bile su cjelobrojne vrijednosti, od kojih se koristio samo niži bajt. Znakovne funkcije automatski pretvaraju svoje argumente u unsigned char. Naravno, možete slobodno pozivati ​​ove funkcije sa znakovnim argumentima, budući da se znakovi automatski podižu na rang cijelih brojeva kada se funkcija pozove.

U naslovu definiran je tip size_t koji je rezultat primjene operatora sizeof i tip je nepredznačenog cijelog broja.

C99 je dodao kvalifikator restrict nekim parametrima nekoliko funkcija izvorno definiranih u C89. Prilikom pregleda svake takve funkcije navest će se njezin prototip koji se koristi u C89 okruženju (kao iu C++ okruženju), au opisu ove funkcije bit će navedeni parametri s atributom restrict.

Popis funkcija

Provjerite pripadnost

isalnum - Provjera je li znak alfanumerički
isalpha - Provjera pripada li simbol slovima
isblank - Provjerite prazan znak
iscntrl - Provjerava da li simbol pripada kontrolnim simbolima
isdigit - Provjera je li znak digitalan
isgraph - Provjerava može li se ispisati znak, ali ne i razmak
islower - Provjerava je li znak mali
isprint - Provjerava je li znak ispisljiv
ispunct - Provjera pripada li simbol interpunkcijskim znakovima
isspace - Provjerava je li znak razmak
isupper - Provjerava je li znak veliko slovo
isxdigit - Provjerava je li znak heksadecimalni

Rad s nizovima znakova

memchr - Pretražuje niz kako bi pronašao prvo pojavljivanje znaka
memcmp - Uspoređuje određeni broj znakova u dva niza
memcpy - Kopira znakove iz jednog niza u drugi
memmove - Kopira znakove iz jednog niza u drugi, uzimajući u obzir preklapanje nizova
memset - Ispunjava određeni broj znakova u nizu zadanim brojem

Manipulacija žicama

strcat - Dodaje kopiju jednog niza danom nizu
strchr - Vraća pokazivač na prvo pojavljivanje nižeg bajta zadanog parametra
strcmp - Uspoređuje dva niza u leksikografskom redu
strcoll - Uspoređuje jedan niz s drugim prema parametru setlocale
strcpy - Kopira sadržaj jednog niza u drugi
strcspn - Vraća niz koji ne sadrži navedene znakove
strerror - Vraća pokazivač na niz koji sadrži poruku o pogrešci sustava
strlen - Vraća duljinu niza završenu nulom

Nisam slučajno stavio temu o stringovima u odjeljak "Nizovi". Budući da je string u biti niz znakova. Evo primjera:

char str = "Ovo je samo niz";

Radi boljeg razumijevanja, isti se red može napisati ovako:

char str = ("E","t","o"," ","p","r","o","s","t","o","","s", "t", "r", "o", "k", "a");

Oni. još uvijek isti niz, samo se sastoji od znakova. Stoga možete raditi s njim, baš kao i s nizovima cijelih brojeva.

Sada pokušajmo rad s nizovima u c. U uvodnim lekcijama naučili smo da simboli pripadaju cjelobrojnim tipovima, tj. svaki znak ima svoju numeričku vrijednost. Evo primjera i njegovog rješenja:

  1. unesenu riječ trebate pretvoriti u velika slova:
  2. #uključi
    #uključi

    Int main()
    {
    char str = "sergej";

    str[i] -= 32;
    }
    for (int i=0; str[i] != "\0";i++)(
    printf("%c", str[i]);
    }
    dobiti();

    Povratak 0;
    }

    Da biste dobili kod broja, jednostavno upotrijebite specifikator %d u funkciji printf. Da, i još jedna važna točka: kraj bilo kojeg linije je nulti terminator, koji je označen posebnim znakom - "\0".

Drugi način za specificiranje niza je da ga deklarirate pomoću char*. Evo primjera:

char *str = "žica";

Oni. kreira se pokazivač na niz i nalazi se negdje u memoriji.

A evo kako možete unijeti stringove preko operatora scanf, koji nam je već poznat:

char str; scanf("%s", str);

Ovdje postoje dvije suptilnosti:

  1. znak za uzimanje adrese ovdje nije potreban, budući da je naziv niza, kao što već znamo, adresa
  2. Duljina ulaznog niza ne smije premašiti 15 znakova, jer posljednji mora biti nulti terminator. Štoviše, sam prevodilac će popuniti ovaj simbol nakon zadnjeg unesenog simbola.

Budući da je jezik C strukturni jezik, već postoje ugrađene funkcije za rad sa žicama i sa simbolima. Za obradu nizova morat ćete uključiti datoteku: ctype.h. Datoteka sadrži funkcije za određivanje formata velikih i malih slova i znakova. Uglavnom, sve što trebate znati o karakteru može se učiniti pomoću funkcija u datoteci ctype.h

Ponekad ćete možda trebati pretvoriti niz u drugu vrstu podataka. Za pretvaranje stringova u druge vrste, postoji biblioteka stdlib. Evo njegovih funkcija:

  1. int atoi (char *str)
  2. dugi atol (char *str)
  3. dvostruko atof (char *str)

Ponekad su te funkcije vrlo korisne, na primjer, kada trebate izdvojiti godinu ili digitalnu vrijednost iz niza. Rad sa stringovima u c (si) je vrlo važna tema, stoga pokušajte razumjeti ovu lekciju.

Metode rada sa stringovima
metoda Struktura i preopterećenja Svrha
Usporedba nizova
Usporedi() public static int Usporedi(niz strA, niz strB)

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

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

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

Statička metoda uspoređuje niz strA sa nizom strB. Vraća pozitivnu vrijednost ako je strA veći od strB; negativno ako je strA manji od strB; a nula ako su nizovi strA i strB jednaki. Usporedbe se rade na temelju registra i kulture.

Ako ignoreCase dobije vrijednost true, usporedba ne uzima u obzir razlike između velikih i malih slova. Inače, ove razlike se uzimaju u obzir.

CompareType parametar specificira određeni način na koji se nizovi uspoređuju. Klasa CultureInfo definirana je u prostoru imena System.Globalization.

public static int Compare(string strA, int indexA, string strB, int indexB, int length)

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

Public static int Compare(string strA, int indexA, string strB, int indexB, int length, StringComparison usporedbaType)

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

Uspoređuje dijelove stringova strA i strB. Usporedba počinje s elementima niza strA i strB i uključuje broj znakova specificiranih parametrom duljine. Metoda vraća pozitivnu vrijednost ako je dio niza strA veći od dijela niza strB; negativna vrijednost ako je dio niza strA manji od dijela niza strB; i nula ako su dijelovi nizova strA i strB koji se uspoređuju jednaki. Usporedbe se rade na temelju registra i kulture.

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

Public static int CompareOrdinal(string strA, int indexA, string strB, int indexB, int count)

Radi isto što i metoda Compare(), ali bez uzimanja u obzir lokalnih postavki

Usporedi s() public int CompareTo(vrijednost objekta)

Uspoređuje pozivni niz s prikazom niza vrijednosnog objekta. Vraća pozitivnu vrijednost ako je pozivni niz veći od vrijednosti; negativno ako je pozivni niz manji od vrijednosti; i nula ako su uspoređeni nizovi jednaki

public int CompareTo(string strB)

Uspoređuje pozivni niz s nizom strB

Jednako() javno nadjačavanje bool jednako(objekt obj)

Vraća booleovu vrijednost true ako pozivni niz sadrži isti niz znakova kao niz znakova obj. Izvodi rednu usporedbu koja razlikuje velika i mala slova, ali nije osjetljiva na kulturu

public bool jednako (vrijednost niza)

Public bool Equals(string value, StringComparison usporedbaType)

Vraća booleovu vrijednost true ako pozivni niz sadrži isti niz znakova kao vrijednost niza. Izvodi se redna usporedba koja razlikuje velika i mala slova, ali nije osjetljiva na kulturu. CompareType parametar specificira određeni način na koji se nizovi uspoređuju

public static bool Equals(string a, string b)

Javni statički bool Jednako (string a, string b, StringComparison usporedbaType)

Vraća booleovu vrijednost true ako niz a sadrži isti niz znakova kao niz b. Izvodi se redna usporedba koja razlikuje velika i mala slova, ali nije osjetljiva na kulturu. CompareType parametar specificira određeni način na koji se nizovi uspoređuju

Ulančavanje (spajanje) nizova
Concat() javni statički niz Concat(niz str0, niz str1);

public static string Concat(params string values);

Kombinira pojedinačne instance niza u jedan niz (ulančavanje)
Traži u nizu
Sadrži () javni bool Sadrži (vrijednost niza) Metoda koja vam omogućuje da odredite sadrži li niz određeni podniz (vrijednost)
Počinje sa() public bool StartsWith(vrijednost niza)

Javni bool StartsWith(string vrijednost, StringComparison usporedbaType)

Vraća booleovu vrijednost true ako pozivni niz počinje vrijednošću podniza. Inače se vraća booleova vrijednost false. CompareType parametar specificira određeni način izvođenja pretraživanja

Završava s() public bool EndsWith(vrijednost niza)

Public bool EndsWith(string value, StringComparison usporedbaType)

Vraća booleovu vrijednost true ako pozivni niz završava vrijednošću podniza. U suprotnom, vraća booleovu vrijednost false. CompareType parametar navodi specifičnu metodu pretraživanja

IndexOf() public int IndexOf(char vrijednost)

Javni int IndexOf(vrijednost niza)

Pronalazi prvo pojavljivanje zadanog podniza ili znaka u nizu. Ako traženi znak ili podniz nije pronađen, vraća se vrijednost -1.

public int IndexOf(char vrijednost, int startIndex)

Public int IndexOf(vrijednost niza, int startIndex)

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

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

Vraća indeks prvog pojavljivanja vrijednosti znaka ili podniza u pozivnom nizu. Pretraživanje počinje od elementa navedenog pomoću startIndex i obuhvaća broj elemenata navedenih pomoću count (ako je navedeno). Metoda vraća -1 ako traženi znak ili podniz nije pronađen

LastIndexOf() Preopterećene verzije slične su metodi IndexOf().

Isto kao IndexOf, ali pronalazi zadnje pojavljivanje znaka ili podniza, a ne prvo

IndexOfAny() public int IndexOfAny(char anyOf)

Public int IndexOfAny(char anyOf, int startIndex)

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

Vraća indeks prvog pojavljivanja bilo kojeg znaka iz polja anyOf pronađenog u pozivnom nizu. Pretraživanje počinje od elementa navedenog pomoću startIndex i obuhvaća broj elemenata navedenih pomoću count (ako je navedeno). Metoda vraća -1 ako se ne podudara niti jedan znak u nizu anyOf. Pretraga se obavlja na ordinalan način

LastIndexOfAny Preopterećene verzije slične su metodi IndexOfAny().

Vraća indeks posljednjeg pojavljivanja bilo kojeg znaka iz polja anyOf pronađenog u pozivnom nizu

Rastavljanje i spajanje nizova
Podjela javni niz Split (razdjelnik znakova parametara)

Javni niz Split (razdjelnik znakova params, int count)

Metoda koja vraća niz nizova s ​​podnizovima prisutnim u ovoj instanci unutar, koji su međusobno odvojeni elementima iz navedenog niza znakova ili nizova.

Prvi oblik metode Split() dijeli pozivni niz na sastavne dijelove. Rezultat je niz koji sadrži podnizove dobivene iz pozivnog niza. Znakovi koji ograničavaju ove podnizove prosljeđuju se u nizu razdjelnika. Ako je niz razdjelnika prazan ili se odnosi na prazan niz, tada se kao razdjelnik podniza koristi razmak. A u drugom obliku ove metode vraća se broj podnizova određen parametrom brojanja.

public string Split (params separator znakova, StringSplitOptions opcije)

Javno dijeljenje niza (razdjelnik nizova, opcije StringSplitOptions)

Javno razdvajanje niza (razdjelnik znakova parametara, int broj, opcije StringSplitOptions)

Javni string Split (string separator, int count, StringSplitOptions opcije)

U prva dva oblika metode Split(), pozivni niz se dijeli na dijelove i vraća se niz koji sadrži podnizove dobivene iz pozivnog niza. Znakovi koji odvajaju ove podnizove prosljeđuju se u nizu razdjelnika. Ako je niz razdjelnika prazan, razmak se koristi kao razdjelnik. A u trećem i četvrtom obliku ove metode vraća se broj redaka ograničen parametrom brojanja.

Ali u svim oblicima, parametar opcija navodi određeni način za rukovanje praznim redcima koji nastaju kada su dva graničnika susjedna. Nabrajanje StringSplitOptions definira samo dvije vrijednosti: Nijedan I RemoveEmptyEntries. Ako je opcija None, tada su prazni nizovi uključeni u konačni rezultat dijeljenja izvornog niza. A ako je parametar opcija postavljen na RemoveEmptyEntries, onda su prazni redovi isključeni iz konačnog rezultata dijeljenja izvornog niza.

Pridružiti() public static string Join(string separator, string value)

Javni statički niz Join(razdjelnik niza, vrijednost niza, int startIndex, int broj)

Konstruira novi niz kombiniranjem sadržaja niza nizova.

Prvi oblik metode Join() vraća niz koji se sastoji od spojenih podnizova proslijeđenih u nizu vrijednosti. Drugi oblik također vraća niz koji se sastoji od podnizova proslijeđenih u nizu vrijednosti, ali oni su spojeni u određeni broj, počevši od elementa niza vrijednosti. U oba oblika, svaki sljedeći redak odvojen je od prethodnog retka razdjelnom linijom određenom parametrom separator.

Linije za punjenje i obrezivanje
Trim() javni niz Trim()

Javni niz Trim(params char trimChars)

Metoda koja vam omogućuje uklanjanje svih pojavljivanja određenog skupa znakova s ​​početka i kraja tekućeg retka.

Prvi oblik metode Trim() uklanja razmake na početku i na kraju iz pozivnog niza. A drugi oblik ove metode uklanja početak i kraj pojavljivanja pozivnog niza znakova iz niza trimChars. Oba oblika vraćaju rezultirajući niz.

PadLeft() javni niz PadLeft(int totalWidth)

Javni niz PadLeft(int totalWidth, char paddingChar)

Omogućuje dodavanje niza znakovima s lijeve strane.

Prvi oblik metode PadLeft() uvodi razmake na lijevoj strani pozivnog niza tako da njegova ukupna duljina postaje jednaka vrijednosti parametra totalWidth. A u drugom obliku ove metode, znakovi označeni parametrom paddingChar unose se s lijeve strane pozivnog niza tako da njegova ukupna duljina postaje jednaka vrijednosti parametra totalWidth. Oba oblika vraćaju rezultirajući niz. Ako je vrijednost parametra totalWidth manja od duljine pozivnog niza, tada se vraća kopija nepromijenjenog pozivnog niza.

PadRight() Isto kao PadLeft()

Omogućuje vam dodavanje niza sa znakovima s desne strane.

Umetanje, brisanje i zamjena redaka
Umetnuti() public string Insert(int startIndex, string value)

Koristi se za umetanje jednog retka u drugi, gdje vrijednost označava red koji treba umetnuti u pozivni redak na startIndex. Metoda vraća rezultirajući niz.

Ukloniti() javni niz Ukloni(int startIndex)

Javni niz Remove(int startIndex, int count)

Koristi se za uklanjanje dijela niza. U prvom obliku metode Remove(), uklanjanje počinje na mjestu označenom s startIndex i nastavlja se do kraja retka. A u drugom obliku ove metode, broj znakova određen parametrom brojanja uklanja se iz niza, počevši od mjesta naznačenog indeksom startIndex.

Zamijeniti() javni niz Zamijeni(char oldChar, char newChar)

Javni niz Zamijeni (niz staraVrijednost, niz novaVrijednost)

Koristi se za zamjenu dijela niza. U prvom obliku metode Replace(), sva pojavljivanja znaka oldChar u pozivnom nizu zamjenjuju se znakom newChar. A u drugom obliku ove metode, sva pojavljivanja niza oldValue u retku poziva zamjenjuju se nizom newValue.

Promjena velikih i velikih slova
ToUpper() javni niz ToUpper()

Pravi velika slova u pozivnom nizu.

Spustiti() javni niz ToLower()

Mala slova u pozivnom nizu.

Dobivanje podniza iz niza
Podniz() javni niz Substring(int startIndex)

Javni niz Podniz (int startIndex, int duljina)

U prvom obliku metode Substring(), podniz se dohvaća počevši od lokacije naznačene parametrom startIndex do kraja pozivajućeg niza. A u drugom obliku ove metode ekstrahira se podniz koji se sastoji od broja znakova određenog parametrom duljine, počevši od mjesta naznačenog parametrom startIndex.

Sljedeći primjer programa koristi nekoliko gore navedenih metoda:

Korištenje sustava; koristeći System.Collections.Generic; koristeći System.Linq; koristeći System.Text; namespace ConsoleApplication1 ( class Program ( static void Main(string args) ( // Usporedite prva dva retka string s1 = "ovo je niz"; niz s2 = "ovo je tekst, a ovo je niz"; if (String. CompareOrdinal(s1, s2) != 0) Console.WriteLine("Nizovi s1 i s2 nisu jednaki"); ("Međutim, oni sadrže isti tekst"); // Ulančavanje nizova Console.WriteLine(String.Concat("\n" + "One, two ","three, four")); // Traži u nizu / / Prvo pojavljivanje podniza if (s2. IndexOf("this") != -1) Console.WriteLine("Riječ \"this\" je pronađena u retku, nalazi se "+ "na: (0) pozicija", 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 iz niza znakova char myCh = ("Y","x","t"); if (s2. IndexOfAny(myCh) != -1) Console.WriteLine("Jedan od znakova iz niza ch "+ "pronađen u trenutnom retku na poziciji (0)", s2.IndexOfAny(myCh)); // Odredi počinje li red danim podnizom if (s2.StartsWith("ovo je tekst") == true) Console.WriteLine("Podniz pronađen!"); // Odredite da li string sadrži podstring // pomoću primjera određivanja korisnikovog OS stringa myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Vaš operativni sustav je Windows XP"); else if (myOS.Contains("NT 6.1")) Console.WriteLine("Vaš operativni sustav je Windows 7"); Konzola.ReadLine(); ) ) )

Malo o usporedbi nizova u C#

Vjerojatno najuobičajenija od svih operacija niza znakova je uspoređivanje jednog niza s drugim. Prije nego što pogledamo metode usporedbe nizova, vrijedi naglasiti sljedeće: Usporedbe nizova mogu se izvršiti u .NET Frameworku na dva glavna načina:

    Prvo, usporedba može odražavati običaje i norme određenog kulturnog okruženja, što su često kulturološke postavke koje dolaze u obzir kada se program provodi. Ovo je standardno ponašanje za neke, ali ne sve metode usporedbe.

    I drugo, usporedba se može napraviti bez obzira na kulturne postavke samo prema rednim vrijednostima znakova koji čine niz. Općenito govoreći, nekulturalne usporedbe nizova koriste leksikografski poredak (i ​​lingvističke značajke) kako bi odredile je li jedan niz veći, manji ili jednak drugom nizu. U ordinalnoj usporedbi, nizovi su jednostavno poredani na temelju nepromijenjene vrijednosti svakog znaka.

Zbog razlika u načinu na koji se usporedbe kulturoloških nizova i rednih usporedbi razlikuju, te posljedica svake takve usporedbe, toplo preporučujemo da slijedite najbolje prakse koje trenutno nudi Microsoft. Uostalom, odabir pogrešne metode za usporedbu nizova može dovesti do neispravnog rada programa kada se njime radi u okruženju različitom od onog u kojem je razvijen.

Odabir načina usporedbe nizova znakova vrlo je važna odluka. Kao opće pravilo i bez iznimke, trebali biste odabrati usporedbu nizova na kulturno osjetljiv način ako se to radi u svrhu prikazivanja rezultata korisniku (na primjer, za prikaz niza nizova poredanih leksikografskim redoslijedom). Ali ako nizovi sadrže fiksne informacije koje se ne namjeravaju mijenjati zbog kulturoloških razlika, kao što je naziv datoteke, ključna riječ, adresa web stranice ili sigurnosna vrijednost, tada biste trebali odabrati ordinalnu usporedbu nizova. Naravno, karakteristike određene aplikacije koja se razvija će diktirati izbor odgovarajuće metode za usporedbu nizova znakova.

Klasa String pruža razne metode usporedbe nizova, koje su navedene u gornjoj tablici. Najuniverzalnija među njima je Compare() metoda. Omogućuje usporedbu dva niza u cijelosti ili djelomično, osjetljivo na velika ili mala slova, na način određen parametrom tipa Usporedba nizova, kao i informacije o kulturi koje pruža parametar tipa KulturaInfo.

Ona preopterećenja metode Compare() koja ne uključuju parametar tipa StringComparison izvode usporedbu nizova znakova osjetljivu na velika i mala slova i kulturu. A u onim preopterećenim varijantama koje ne sadrže parametar tipa CultureInfo, informacije o kulturnom okruženju određene su trenutnim okruženjem vremena izvođenja.

Vrsta StringComparison je enumeracija koja definira vrijednosti prikazane u tablici ispod. Pomoću ovih vrijednosti možete stvoriti usporedbe nizova koje odgovaraju potrebama vaše specifične aplikacije. Stoga dodavanje parametra tipa StringComparison proširuje mogućnosti metode Compare() i drugih metoda usporedbe kao što je Equals(). To također omogućuje nedvosmisleno označavanje načina na koji se nizovi namjeravaju uspoređivati.

Zbog razlika između kulturološki osjetljivih usporedbi nizova i ordinalnih usporedbi, važno je biti što je moguće precizniji u tom pogledu.

Vrijednosti definirane u nabrajanju StringComparison
Značenje Opis
CurrentCulture Usporedbe nizova vrše se korištenjem trenutnih postavki kulturnog okruženja
CurrentCultureIgnoreCase Usporedbe nizova vrše se pomoću trenutnih postavki kulture, ali ne razlikuju velika i mala slova
InvariantCulture Usporedbe nizova se rade pomoću nepromjenjivih, tj. univerzalne podatke o kulturnoj sredini
InvariantCultureIgnoreCase Usporedbe nizova se rade pomoću nepromjenjivih, tj. univerzalni kulturni podaci i neosjetljivi su na velika i mala slova
Redni Usporedbe nizova se rade pomoću rednih vrijednosti znakova u nizu. U tom slučaju leksikografski poredak može biti poremećen, a konvencije usvojene u određenom kulturnom okruženju zanemarene
OrdinalIgnoreCase Usporedbe nizova se rade pomoću rednih vrijednosti znakova u nizu, ali nisu osjetljive na velika i mala slova

U svakom slučaju, metoda Compare() vraća negativnu vrijednost ako je prvi niz koji se uspoređuje manji od drugog; pozitivan ako je prvi niz koji se uspoređuje veći od drugog; i konačno, nula ako su oba niza koja se uspoređuju jednaka. Iako metoda Compare() vraća nulu ako su nizovi koji se uspoređuju jednaki, općenito je bolje koristiti metodu Equals() ili operator == da se utvrdi jesu li nizovi znakova jednaki.

Činjenica je da metoda Compare() određuje jednakost uspoređivanih nizova na temelju njihovog redoslijeda sortiranja. Dakle, ako se napravi kulturološka usporedba nizova, oba niza mogu biti ista u svom redoslijedu sortiranja, ali ne i jednaka u sadržaju. Prema zadanim postavkama, jednakost niza se određuje u metodi Equals(), na temelju rednih vrijednosti znakova i bez uzimanja u obzir kulturnog okruženja. Stoga se prema zadanim postavkama oba niza uspoređuju u ovoj metodi radi apsolutne jednakosti znak po znak, slično kao što se to radi u operatoru ==.

Unatoč velikoj svestranosti metode Compare(), za jednostavne redne usporedbe nizova znakova lakše je koristiti metodu CompareOrdinal(). Konačno, imajte na umu da metoda CompareTo() izvodi samo kulturno osjetljive usporedbe nizova.

Sljedeći program demonstrira upotrebu metoda Compare(), Equals(), CompareOrdinal() i operatora == i != za usporedbu nizova znakova. Imajte na umu da prva dva primjera usporedbe jasno pokazuju razlike između kulturološki osjetljivih usporedbi nizova i rednih usporedbi u engleskom govornom okruženju:

Korištenje sustava; Primjer klase ( static void Main() ( string str1 = "alpha"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alpha"; string str5 = "alpha, beta"; int rezultat; / / Najprije pokažite razlike između usporedbe stringova osjetljivih na kulturu // i rezultata redne usporedbe = String.Compare(str1, str2, StringComparison.CurrentCulture); Console.Write("Usporedba stringova osjetljivih na kulturu: "); ) Console.WriteLine (str1 + "veće od " + str2); else Console.WriteLine(str1 + " jednako " + str2); ) Console.WriteLine(str1 + "more than" + str2); else Console.WriteLine(str1 + " equal to " + str4); // Koristi metodu CompareOrdinal() = String.CompareOrdinal( str1, str2); .Write("Uspoređivanje nizova koristeći CompareOrdinal():\n"); if (rezultat 0) Console.WriteLine(str1 + " veći od " + str2); else Console.WriteLine(str1 + " jednako " + str4); Konzola.WriteLine(); // Utvrdite jednakost niza korištenjem == operatora // Ovo je redna usporedba nizova znakova if (str1 == str4) Console.WriteLine(str1 + " == " + str4); // Definirajte nejednakost linije koristeći != operator if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Konzola.WriteLine(); // Izvršite rednu usporedbu nizova bez obzira na velika i mala slova // koristeći metodu Equals() if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Usporedba nizova koristeći metodu Equals() s " + "Parametar OrdinalIgnoreCase: \n" + str1 + " jednako " + str2); Konzola.WriteLine(); // Usporedi dijelove nizova if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Usporedi nizove uzimajući u obzir trenutno kulturno okruženje:" + "\n3 prvi znakovi niza " + str2 + " više od prva 3 znaka retka " + str5); ) ) )

Pokretanje ovog programa daje sljedeće rezultate:

Najbolji članci na temu