Kako podesiti pametne telefone i računare. Informativni portal

Šta se podrazumeva pod stringovima u jeziku C? Operatori klase string

IN savremeni standard C++ definira klasu sa funkcijama i svojstvima (varijable) za organiziranje rada sa stringovima (in klasični jezik Ne postoje stringovi kao takvi, postoje samo nizovi znakova char):

#include

#include

#include

Da biste radili sa stringovima, također morate povezati standardni imenski prostor:

Using namespace std;

U suprotnom, morat ćete navesti deskriptor klase std::string posvuda umjesto string.

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

#include #include #include korištenje imenskog prostora std; int main() ( string s = "Test"; s.insert(1,"!"); cout<< s.c_str() << endl; string *s2 = new string("Hello"); s2->erase(s2->end()); cout<< s2->c_str(); cin.get(); return 0; )

Glavne karakteristike koje klasa string ima:

  • inicijalizacija nizom znakova (ugrađeni tip stringa) ili drugim objektom tipa string . Ugrađeni tip nema drugu mogućnost;
  • kopiranje jednog reda u drugi. Za ugrađeni tip morate koristiti funkciju strcpy();
  • Pristup pojedinačni likovi redova za čitanje i pisanje. U ugrađenom nizu, ovo se radi pomoću indeksne operacije ili indirektnog adresiranja pomoću pokazivača;
  • poređenje dva niza za jednakost. Za ugrađeni tip, koriste se funkcije strcmp() porodice;
  • konkatenacija (konkatenacija) dva niza, proizvodeći rezultat ili kao treći niz ili umjesto jednog od originalnih. Za ugrađeni tip koristi se funkcija strcat(), ali za dobivanje rezultata nova linija, morate uzastopno koristiti funkcije strcpy() i strcat(), a također voditi računa o dodjeli memorije;
  • ugrađena sredstva za određivanje dužine stringa (funkcije člana klase size() i l ength()). Jedini način da saznate dužinu niza ugrađenog tipa je izračunavanje pomoću funkcije strlen();
  • mogućnost saznanja da li je niz prazan.

Pogledajmo ove osnovne sposobnosti u detaljima.

Inicijalizacija nizova pri opisivanju i dužina žice(ne uključujući završni null terminator):

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

Niz također može biti prazan:

String st2;

Da to proverim je linija prazna, možete uporediti njegovu dužinu sa 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 kreiranja niza inicijalizira objekt tipa string drugim objektom istog tipa:

String st3(st);

String st3 je inicijaliziran stringom st. Kako možemo osigurati ove linije se poklapaju? Koristimo operator poređenja (==):

If (st == st3) // inicijalizacija je uspjela

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

St2 = st3; // kopiraj st3 u st2

Za konkatenacija nizova koristi se operator sabiranja (+) ili operator sabiranja plus (+=). Neka su data dva reda:

String s1("zdravo, "); string s2("svijet\n");

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

String s3 = s1 + s2;

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

S1 += s2;

Operacija sabiranja može spojiti objekte klase string ne samo među sobom, već i sa ugrađenim nizovima tipa. Možete prepisati gornji primjer tako da posebni znakovi i znakovi interpunkcije budu predstavljeni ugrađenim tipom char *, a značajne riječi predstavljene su objektima niza klase:

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

Takvi izrazi funkcionišu jer kompajler "zna" kako da automatski konvertuje objekte ugrađenog tipa u objekte string klase. Također je moguće jednostavno dodijeliti ugrađeni string objektu stringa:

String s1; const char *pc = "niz znakova"; s1 = kom; // Desno

Inverzna transformacija u ovom slučaju ne radi. Pokušaj da se izvrši sljedeća inicijalizacija niza ugrađenog tipa će uzrokovati grešku kompilacije:

Char *str = s1; // greška kompilacije

Da biste izvršili ovu konverziju, morate eksplicitno pozvati funkciju člana nazvanu c_str() ("C string"):

Const char *str = s1.c_str();

Funkcija c_str() vraća pokazivač na niz znakova koji sadrži string objekta string kako bi se pojavio u ugrađenom tipu stringa. Ključna riječ const ovdje sprječava "opasnu" mogućnost u modernim vizualnim okruženjima direktnog mijenjanja sadržaja objekta putem pokazivača.

TO 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 zamjenjuje sve tačke podvlakama:

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

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

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

#include

Budući da se string objekt ponaša kao kontejner, na njega se mogu primijeniti drugi algoritmi. Ovo vam omogućava da riješite probleme koji nisu direktno riješeni funkcijama string klase.

Ispod je kratak opis glavnih operatora i funkcija string klase; veze u tabeli vode do opisa na ruskom jeziku na Internetu. Potpuniju listu mogućnosti string klase možete pronaći, na primjer, na Wikipediji ili na web stranici cplusplus.com.

Linije. String ulaz/izlaz. Formatirani I/O. Obrada nizova pomoću standardnih funkcija jezika C. Rad sa memorijom.

1.1. Deklaracija i inicijalizacija stringova.

String je niz znakova koji se završava praznim znakom '\0'. Niz je deklarisan kao običan niz znakova, na primjer,

char s1; // niz dugačak 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.

String konstante su zatvorene u dvostrukim navodnicima, za razliku od znakova koji su zatvoreni u jednostruke navodnike. Na primjer,

"Ovo je niz."

Dužina string konstante ne može premašiti 509 znakova prema standardu. Međutim, mnoge implementacije dozvoljavaju veće dužine nizova.

Prilikom inicijalizacije stringova, bolje je ne specificirati veličinu niza; kompajler će to učiniti tako što će izračunati dužinu niza i dodati mu jedan. Na primjer,

char s1 = “Ovo je string.”;

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

1.2. String ulaz/izlaz.

Da biste unijeli niz iz konzole, koristite funkciju

char* gets(char *str);

koji upisuje string na adresu str i vraća adresu unesenog niza. Funkcija zaustavlja unos ako naiđe na znak '\n' ili EOF (kraj datoteke). Znak novog reda se ne kopira. Nulti bajt se stavlja na kraj reda za čitanje. Ako je uspješna, funkcija vraća pokazivač na pročitanu liniju, a ako je neuspješna, NULL.

Za izlaz stringa na 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 get i puts opisani su u datoteci zaglavlja stdio.h.

#include

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 nije uspješan, vraća EOF. Parametar formata mora pokazivati ​​na niz koji treba formatirati, a koji sadrži specifikacije ulaznog formata. Broj i tipovi argumenata koji prate niz formata moraju odgovarati broju i tipovima ulaznih formata navedenih u nizu formata. Ako ovaj uvjet nije ispunjen, rezultat funkcije je nepredvidiv.

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

Literalni znakovi u nizu formata, sa izuzetkom znaka %, zahtijevaju da se potpuno isti znakovi pojavljuju u ulaznom toku. Ako nema takvog znaka, funkcija scanf prestaje da ulazi. Funkcija scanf preskače literalne znakove.

Općenito, specifikacija ulaznog formata izgleda ovako:

%[*] [širina] [modifikatori] tip

Simbol '*' označava izostavljanje prilikom ulaska u polje definisano ovom specifikacijom;

- ‘širina’ definira maksimalan broj znakova unesenih prema ovoj specifikaciji;

Tip može imati sljedeće vrijednosti:

c – niz znakova,

s – niz znakova, redovi su odvojeni praznim znakovima,

d – predznačeni cijeli broj od 10 s/s,

i – cijeli broj s predznakom, brojni sistem zavisi od prve dvije cifre,

u – neoznačeni cijeli broj pri 10 s/s,

o – neoznačeni cijeli broj u 8 s/s,

x, X – neoznačeni cijeli broj pri 16 s/s,

e, E, f, g, G – plutajući broj,

p – pokazivač na pokazivač,

n – pokazivač na cijeli broj,

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

U potonjem slučaju, samo znakovi zatvoreni u uglastim zagradama bit će uneseni iz ulaznog toka. Ako je prvi znak unutar uglastih zagrada '^', tada se unose samo oni znakovi koji nisu u nizu. Opseg znakova u nizu je specificiran pomoću simbola '-'. Kada unosite znakove, unose se i početni prazni znakovi i zadnji null 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 plutajuće brojeve.

Sljedeći primjer pokazuje upotrebu funkcije scanf. Imajte na umu da specifikaciji formata, počevši od unosa plutajućeg broja, prethodi razmak.

#include

printf("Unesite cijeli broj: ");

scanf("%d", &n);

printf("Unesite dvostruko: ");

scanf(" %lf", &d);

printf("Unesite znak: ");

scanf(" %c", &c);

printf("Unesite string: ");

scanf(" %s", &s);

Imajte na umu da je u ovom programu broj s pomičnim zarezom inicijaliziran. Ovo se radi tako da kompajler uključuje biblioteku koja podržava rad sa plutajućim brojevima. Ako se to ne učini, pojavit će se greška u toku rada 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 izlaznih 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 specificiranih u nizu formata. Općenito, specifikacija izlaznog formata izgleda ovako:

%[zastavice] [širina] [.preciznost] [modifikatori] tip

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

- 'width' definira minimalni broj izlaznih znakova prema ovoj specifikaciji;

- ‘.preciznost’ definira maksimalan broj prikazanih znakova;

- ‘modifikatori’ određuju vrstu argumenata;

- 'type' specificira tip argumenta.

Za izlaz potpisanih cijelih brojeva koristi se sljedeći izlazni format:

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

- – poravnanje lijevo, zadano – desno;

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

‘razmak’ – na poziciji znaka se prikazuje razmak;

d – int tip podataka.

Za izlaz neoznačenih cijelih brojeva, koristite sljedeći izlazni format:

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

# – početna 0 se ispisuje 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.

Sljedeći izlazni format se koristi za prikaz brojeva s pomičnim zarezom:

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

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

f – broj fiksne tačke,

e – broj u eksponencijalnom obliku, eksponent je označen slovom “e”,

E – broj u eksponencijalnom obliku, eksponent je označen 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. Formatiranje stringova.

Postoje varijante funkcija scanf i printf koje su dizajnirane za formatiranje stringova i zovu se sscanf i sprintf.

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

čita podatke iz niza specificiranog sa str, u skladu sa nizom formata specificiranim formatom. Ako je uspješan, vraća broj pročitanih podataka, a ako nije uspješan, vraća EOF. Na primjer,

#include

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

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

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

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

printf("%f\n", d); // otisci: 1,200000

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

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

formatira string u skladu s formatom specificiranim parametrom formata i upisuje rezultirajući rezultat u međuspremnik niza znakova. Funkcija vraća broj znakova upisanih u bafer niza znakova, isključujući završni null bajt. Na primjer,

#include

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

char s = "Ovo je string.";

sprintf(bafer, str, c, n, d, s);

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

1.5. Pretvorite nizove u numeričke podatke.

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

Za pretvaranje stringa u cijeli broj koristite funkciju

int atoi (const char *str);

char *str = “-123”;

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

Da biste string pretvorili u dugi cijeli broj, koristite funkciju

long int atol (const char *str);

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

char *str = “-123”;

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

Da konvertujete niz u dvostruki broj, koristite funkciju

double atof(const char *str);

koji u slučaju uspjeha vraća plutajući broj tipa double, u koji se konvertuje string str, a u slučaju neuspjeha, 0. Na primjer,

char *str = “-123.321”;

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

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

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

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

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

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

Ako je prvi znak cifra 0, a drugi znak cifra od 1 do 7, onda 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 osnova broj između 2 i 36, tada se ta vrijednost uzima kao osnova brojevnog sistema, a bilo koji znak izvan brojevnog sistema prestaje da se pretvara. U brojevnim sistemima od 11 do 36, simboli 'A' do 'Z' ili 'a' do 'z' se koriste za predstavljanje cifara.

Vrijednost argumenta endptr postavlja strtol funkcija. Ova vrijednost sadrži pokazivač na znak koji je zaustavio konverziju stringa str. Funkcija strtol vraća konvertirani broj ako je uspješan i 0 ako nije uspio. Na primjer,

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čki prikaz broja u broj tipa unsigned long int.

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

Pretvara simbolički prikaz broja u dvostruki.

Sve funkcije navedene u ovom paragrafu prestaju raditi kada naiđu na prvi znak koji ne odgovara formatu broja o kojem je riječ.

Osim toga, ako vrijednost znakova broja prelazi 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, atof i strtod funkcije vraćaju HUGE_VAL vrijednost, strtol funkcija vraća LONG_MAX ili LONG_MIN vrijednost, a strtoul funkcija vraća ULONG_MAX vrijednost.

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

1.6. Standardne funkcije za rad sa stringovima.

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

1. Poređenje nizova. Funkcije strcmp i strncmp se koriste za poređenje stringova.

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

leksikografski upoređ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 upoređuje najviše prvih n znakova iz stringova 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 poređenja nizova

#include

#include

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 se koriste za kopiranje nizova.

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

kopira string str2 u string str1. Cijeli string str2 se kopira, uključujući završni null bajt. Funkcija vraća pokazivač na str1. Ako se linije preklapaju, rezultat je nepredvidiv.

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

kopira n znakova iz string str2 u string str1. Ako str2 sadrži manje od n znakova, tada se zadnji 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 string.";

strcpy(str1, str2);

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

4. Povezivanje žica. Funkcije strcat i strncat se koriste za spajanje nizova u jedan string.

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

dodaje string str2 stringu str1, sa brisanim zadnjim nultim bajtom stringa str1. Funkcija vraća pokazivač na string str1.

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

dodaje n znakova iz string str2 u string str1, sa zadnjim nultim bajtom string str1 izbrisanim. Funkcija vraća pokazivač na string str1. ako je dužina stringa str2 manja od n, tada se dodaju samo znakovi uključeni u string str2. Nakon spajanja stringova, null bajt se uvijek dodaje str1. Funkcija vraća pokazivač na string str1.

#include

#include

char str1 = "String";

char str2 = "catenation";

char str3 = "Da Ne";

strcat(str1, str2);

printf("%s\n", str1); // ispisuje: string catenation

strncat(str1, str3, 3);

printf("%s\n", str1); // ispisuje: string catenation 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 specificiranog sa c u stringu str. Ako je uspješna, funkcija vraća pokazivač na prvi pronađeni znak, a ako nije uspjela, NULL.

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

traži posljednje pojavljivanje znaka specificiranog sa c u stringu str. Ako je uspješna, funkcija vraća pokazivač na posljednji pronađeni znak, a ako nije uspjela, NULL.

#include

#include

char str = "Traženje znakova";

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

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 nije uspjela, NULL.

char str = "123 abc";

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

6. Poređenje nizova. Funkcija strstr se koristi za upoređivanje stringova.

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

pronalazi prvo pojavljivanje str2 (bez zadnjeg nul bajta) u str1. Ako je uspješna, funkcija vraća pokazivač na pronađeni podniz, a ako nije uspješna, NULL. Ako str1 pokazivač pokazuje na string nulte dužine, tada funkcija vraća str1 pokazivač.

char str = "123 abc 456;

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

7. Rastavljanje niza u tokene. Funkcija strtok se koristi za raščlanjivanje niza u tokene.

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

vraća pokazivač na sljedeći token (riječ) u nizu str1, u kojem su graničnici tokena znakovi iz stringa str2. Ako nema više tokena, funkcija vraća NULL. Prilikom prvog poziva funkcije strtok, parametar str1 mora pokazivati ​​na niz koji je tokeniziran, a na sljedećim pozivima ovaj parametar mora biti postavljen na NULL. Nakon pronalaženja tokena, strtok funkcija upisuje null bajt nakon ovog tokena umjesto graničnika.

#include

#include

char str = "12 34 ab cd";

p = strtok(str, " ");

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

p = strtok(NULL, " ");

8. Određivanje dužine niza. Funkcija strlen se koristi za određivanje dužine niza.

size_t strlen (const char *str);

vraća dužinu niza, zanemarujući posljednji null bajt. Na primjer,

char str = "123";

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

1.7. Funkcije za rad sa memorijom.

Datoteka zaglavlja string.h također opisuje funkcije za rad sa 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 specificiranog sa c u n bajtova stringa str.

int memcmp (const void *str1, const void *str2, size_t n);

upoređuje prvih n bajtova stringova str1 i str2.

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

kopira prvih n bajtova iz string str1 u string 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ći nizovi pravilno rukuju.

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

kopira karakter specificiran sa c u prvih n bajtova str.

34

--- C# vodič --- Stringovi

Sa stanovišta redovnog programiranja, string string tip podataka je jedan od najvažnijih u C#. Ovaj tip definira i podržava nizove znakova. U brojnim drugim programskim jezicima, string je niz znakova. A u C#, stringovi su objekti. Stoga je tip stringa referentni tip.

Izgradnja struna

Najjednostavniji način za konstruiranje niza znakova je korištenje string literala. Na primjer, sljedeći red koda dodjeljuje varijablu string reference str referencu na literal niza:

String str = "Primjer stringa";

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

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

Jednom kada se kreira string objekat, može se koristiti svuda gde vam je potreban niz teksta zatvoren u navodnicima.

String persistence

Začudo, sadržaj objekta tipa string ne može se promijeniti. To znači da kada je niz znakova kreiran, ne može se mijenjati. Ali ovo ograničenje doprinosi efikasnijoj implementaciji znakovnih nizova. Stoga se ovaj naizgled očigledan nedostatak zapravo pretvara u prednost. Dakle, ako je niz potreban kao varijacija postojećeg stringa, onda u tu svrhu treba kreirati novi niz koji sadrži sve potrebne promjene. A pošto se neiskorišteni string objekti automatski skupljaju kao smeće, ne morate čak ni da brinete o sudbini nepotrebnih nizova.

Treba, međutim, naglasiti da su varijabilne reference na stringove (tj. objekte tipa string) podložne promjenama, te stoga mogu upućivati ​​na drugi objekt. Ali sadržaj samog string objekta se ne mijenja nakon što je kreiran.

Pogledajmo primjer:

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

Hajde da kompajliramo aplikaciju i učitamo rezultirajući sklop u uslužni program ildasm.exe. Slika prikazuje CIL kod koji će biti generiran za void addNewString() metod:

Imajte na umu da postoje brojni pozivi opkodu ldstr (učitavanje niza). Ovaj CIL ldstr opcode izvodi učitavanje novog string objekta na upravljanu hrpu. Kao rezultat toga, prethodni objekat koji je sadržavao vrijednost "Ovo je moj udar" će na kraju biti sakupljen.

Rad sa stringovima

U razredu System.String obezbeđen je skup metoda za određivanje dužine 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 polja, indeksera i string klase

String klasa definira jedno polje:

Javni statički string samo za čitanje Empty;

Polje Empty označava prazan niz, tj. string koji ne sadrži znakove. Ovo se razlikuje od prazne string reference, koja se jednostavno pravi nepostojećem objektu.

Pored toga, klasa String definira jedan indeksator samo za čitanje:

Javno označi ovo (dobi;)

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

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

Javna int dužina ( get; )

Svojstvo Length vraća broj znakova u nizu. Primjer ispod pokazuje upotrebu indeksera i svojstva Length:

Korišćenje sistema; class Primjer ( static void Main() ( string str = "Jednostavan string"; // Dobivamo dužinu niza i 6. znak u retku pomoću indeksera Console.WriteLine("Dužina niza je (0), 6. znak je "(1)"" , str.Dužina, str); ) )

Operatori klase string

String klasa preopterećuje sljedeća dva operatora: == i !=. Operator == se koristi za testiranje jednakosti dva niza znakova. Kada se operator == primjenjuje na reference objekata, on obično testira da li su obje reference napravljene na isti objekt. A kada se operator == primeni na reference na objekte tipa String, sadržaj samih nizova se poredi radi jednakosti. Isto važi i za operator !=. Kada se primjenjuje na reference na objekte tipa String, sadržaj samih nizova se uspoređuje zbog 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 da li je jedan string veći od drugog, trebali biste pozvati metodu Compare() definiranu u klasi String.

Kao što će postati jasno, mnoge vrste poređenja znakovnih nizova oslanjaju se na kulturne informacije. Ali ovo se ne odnosi na operatore == i !=. Uostalom, oni jednostavno upoređuju redne vrijednosti znakova u nizovima. (Drugim riječima, oni uspoređuju binarne vrijednosti znakova koji nisu modificirani kulturnim normama, odnosno standardima lokalizacije.) Stoga, ovi operatori izvode poređenja nizova na način bez obzira na velika i mala slova i neosjetljiv na kulturu.

Metode string klase

Sljedeća tabela navodi neke od najzanimljivijih metoda u ovoj klasi, grupirane po namjeni:

Određivanje znakova u nizu

operator=

dodeljuje vrednosti nizu

dodijeliti

dodeljuje znakove nizu

Pristup pojedinačnim likovima

at

dobivanje specificiranog znaka i provjeru da li je indeks izvan granica

operater

dobijanje specificiranog karaktera

front

dobijanje prvog lika

nazad

dobijanje poslednjeg lika

podaci

vraća pokazivač na prvi znak niza

c_str

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

Provjera kapaciteta linije

prazan

provjerava da li je niz prazan

veličina
dužina

vraća broj znakova u nizu

max_size

vraća maksimalan broj znakova

rezerva

rezerviše skladišni prostor

Operacije sa stringovima

jasno

briše sadržaj niza

insert

ubacivanje znakova

izbrisati

brisanje znakova

push_back

dodavanje znaka na kraj niza

pop_back

uklanja posljednji znak

append

operator+=

dodaje znakove na kraj niza

uporedi

upoređuje dva niza

zamijeniti

zamjenjuje svako pojavljivanje navedenog znaka

substr

vraća podniz

kopija

kopira znakove

promeni veličinu

mijenja broj pohranjenih znakova

C i C++ biblioteka funkcija uključuje bogat skup funkcija za obradu nizova i znakova. Funkcije stringova rade na nizovima znakova koji se završavaju nultim znakovima. U jeziku C, da biste koristili string funkcije, morate uključiti datoteku zaglavlja na početku programskog modula , a za simbolične - datoteku zaglavlja . C++ koristi zaglavlja za rad sa funkcijama stringova i znakova I respektivno. Ovo poglavlje koristi imena 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 niza 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, oni se nalaze između razmaka (0x20) i tilde (OxFE). Kontrolni znakovi imaju vrijednosti između nule i Ox1F; oni takođe uključuju simbol DEL(Ox7F).

Istorijski gledano, argumenti karakternih funkcija bili su cjelobrojne vrijednosti, od kojih je korišten samo niži bajt. Funkcije znakova automatski pretvaraju svoje argumente u nepotpisani znak. Naravno, možete slobodno pozvati 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 neoznačenog cijelog broja.

C99 je dodao kvalifikator ograničenja nekim parametrima nekoliko funkcija prvobitno definiranih u C89. Prilikom pregleda svake takve funkcije, dat će se njen prototip koji se koristi u okruženju C89 (kao i u okruženju C++), a parametri sa restriktivnim atributom će biti navedeni u opisu ove funkcije.

Lista funkcija

Provjerite pripadnost

isalnum - Provjerava da li je znak alfanumerički
isalpha - Provjerava da li simbol pripada slovima
isprazno - Provjerite ima li praznog znaka
iscntrl - Provjerava da li simbol pripada kontrolnim simbolima
isdigit - Provjera da li je znak digitalan
isgraph - Provjerava da li se znak može ispisati, ali ne i razmak
islower - Provjerava da li je znak mala slova
isprint - Provjerava da li se znak može ispisati
ispunct - Provjerava da li simbol pripada znacima interpunkcije
isspace - Provjerava da li je znak razmak
isupper - Provjerava da li je znak velika slova
isxdigit - Provjerava da li je znak heksadecimalan

Rad sa 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 niza
memset - popunjava određeni broj znakova u nizu datim brojem

Manipulacija stringovima

strcat - Dodaje kopiju jednog stringa datom nizu
strchr - Vraća pokazivač na prvo pojavljivanje nižeg bajta datog parametra
strcmp - Uspoređuje dva niza u leksikografskom redoslijedu
strcoll - Uspoređuje jedan string s drugim prema parametru setlocale
strcpy - Kopira sadržaj jednog stringa u drugi
strcspn - Vraća string koji ne sadrži navedene znakove
strerror - Vraća pokazivač na niz koji sadrži poruku o sistemskoj grešci
strlen - Vraća null-terminiranu dužinu niza

Nije slučajno što sam temu o stringovima smjestio u odjeljak „Nizovi“. Pošto je string u suštini niz znakova. Evo primjera:

char str = "Ovo je samo string";

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

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

One. još uvijek isti niz, samo se sastoji od znakova. Stoga, možete raditi s njim, baš kao i sa cijelim nizovima.

A sada da probamo rad sa žicama u c. U uvodnim časovima naučili smo da simboli pripadaju cjelobrojnim tipovima, tj. svaki znak ima svoju numeričku vrijednost. Evo primjera i njegovog rješenja:

  1. potrebno je da unesenu riječ konvertujete u velika slova:
  2. #include
    #include

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

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

    Povratak 0;
    }

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

Drugi način da navedete niz je da ga deklarirate pomoću char*. Evo primjera:

char *str = "žica";

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

A evo kako možete unijeti nizove kroz scanf operator, koji nam je već poznat:

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

Ovdje postoje dvije suptilnosti:

  1. znak za uzimanje adrese ovde nije potreban, pošto je ime niza, kao što već znamo, adresa
  2. Dužina ulaznog niza ne bi trebalo da prelazi 15 karaktera, pošto poslednji mora biti nulti terminator. Štaviše, sam kompajler će popuniti ovaj simbol nakon vašeg posljednjeg unesenog simbola.

Pošto je jezik C strukturni jezik, već postoje ugrađene funkcije za rad sa žicama i sa simbolima. Za obradu stringova morat ćete uključiti datoteku: ctype.h. Datoteka sadrži funkcije za određivanje veličine i formata znakova. U osnovi, sve što bi možda trebalo da znate o karakteru može se uraditi pomoću funkcija u datoteci ctype.h

Ponekad ćete možda morati da konvertujete niz u drugi tip podataka. Za pretvaranje stringova u druge tipove postoji biblioteka stdlib. Evo njegovih funkcija:

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

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

Metode rada sa nizovima
Metoda Struktura i preopterećenja Svrha
Poređenje nizova
uporedi() 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 CompareType)

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

Statička metoda uspoređuje string strA sa stringom strB. Vraća pozitivnu vrijednost ako je strA veći od strB; negativan ako je strA manji od strB; i nula ako su stringovi strA i strB jednaki. Poređenja se vrše na osnovu registra i kulture.

Ako ignoreCase procijeni na true, poređenje ne uzima u obzir razlike između velikih i malih slova. Inače, ove razlike se uzimaju u obzir.

Parametar CompareType specificira specifičan način na koji se nizovi uspoređuju. Klasa CultureInfo je definirana u imenskom prostoru System.Globalization.

public static int Compare (string strA, int indexA, string strB, int indexB, int dužina)

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

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

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

Uspoređuje dijelove nizova strA i strB. Poređenje počinje sa elementima stringa strA i strB i uključuje broj znakova specificiranih parametrom dužine. Metoda vraća pozitivnu vrijednost ako je dio stringa strA veći od dijela stringa strB; negativna vrijednost ako je dio niza strA manji od dijela stringa strB; i nula ako su dijelovi stringova strA i strB koji se upoređuju jednaki. Poređenja se vrše na osnovu registra i kulture.

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

Javni statički int CompareOrdinal(string strA, int indeksA, string strB, int indeksB, int broj)

Radi istu stvar kao i Compare() metoda, ali bez uzimanja u obzir lokalnih postavki

uporedi sa() public int CompareTo(vrijednost objekta)

Uspoređuje pozivni niz sa stringovom reprezentacijom objekta vrijednosti. Vraća pozitivnu vrijednost ako je pozivni niz veći od vrijednosti; negativan ako je pozivni niz manji od vrijednosti; i nula ako su upoređeni nizovi jednaki

public int CompareTo(string strB)

Upoređuje pozivni niz sa stringom strB

jednako() javno nadjačavanje bool jednako (object obj)

Vraća boolean true ako pozivni niz sadrži isti niz znakova kao i reprezentacija stringa za obj. Izvodi poređenje rednog reda koji je osjetljiv na velika i mala slova, ali je kulturološki neosjetljiv

javni bool jednako (vrijednost niza)

Javni bool Jednako (vrijednost niza, StringComparison ComparisonType)

Vraća logičku vrijednost true ako pozivni niz sadrži isti niz znakova kao i vrijednost stringa. Izvodi se ordinalno poređenje koje je osjetljivo na velika i mala slova, ali ne i kulturno. Parametar CompareType specificira specifičan način na koji se nizovi uspoređuju

javni statički bool jednako (niz a, niz b)

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

Vraća logičku vrijednost true ako string a sadrži isti niz znakova kao string b. Izvodi se ordinalno poređenje koje je osjetljivo na velika i mala slova, ali ne i kulturno. Parametar CompareType specificira specifičan način na koji se nizovi uspoređuju

Konkatenacija (povezivanje) nizova
concat() javni statički string Concat(string str0, string str1);

javni statički string Concat(vrijednosti niza parametara);

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

Javni bool StartsWith(vrijednost niza, StringComparison ComparisonType)

Vraća logičku vrijednost true ako pozivni niz počinje vrijednošću podniza. U suprotnom, vraća se logička vrijednost false. Parametar CompareType specificira specifičan način izvođenja pretraživanja

Završava sa() javni bool EndsWith(vrijednost niza)

Javni bool EndsWith(vrijednost niza, StringComparison ComparisonType)

Vraća logičku vrijednost true ako se pozivajući niz završava vrijednošću podniza. U suprotnom, vraća logičku vrijednost false. Parametar CompareType specificira specifičnu metodu pretraživanja

IndexOf() public int IndexOf(vrijednost znakova)

Javni int IndexOf(vrijednost niza)

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

public int IndexOf(vrijednost char, int startIndex)

Public int IndexOf(vrijednost niza, int startIndex)

Javni int IndexOf(vrijednost znakova, int startIndex, int broj)

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

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

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

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

IndexOfAny() public int IndexOfAny(char anyOf)

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 niza anyOf koji se nalazi u pozivnom nizu. Pretraživanje počinje od elementa specificiranog od strane startIndex i obuhvata broj elemenata specificiranih count (ako je navedeno). Metoda vraća -1 ako se nijedan znak u nizu anyOf ne podudara. Pretres se vrši na redovan način

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

Vraća indeks posljednjeg pojavljivanja bilo kojeg znaka iz niza anyOf koji se nalazi u pozivnom nizu

Rastavljanje i spajanje nizova
Podijeliti javni string Split (params char separator)

Javni niz Split (params char separator, int count)

Metoda koja vraća niz stringova sa podstringovima prisutnim u ovoj instanci unutra, koji su međusobno odvojeni elementima iz specificiranog char ili niza nizova.

Prvi oblik metode Split() dijeli pozivni niz na njegove sastavne dijelove. Rezultat je niz koji sadrži podnizove dobijene iz pozivajućeg niza. Znakovi koji ograničavaju ove podnizove se prosleđuju u nizu separatora. Ako je niz separatora prazan ili se odnosi na prazan niz, tada se kao separator podniza koristi razmak. I u drugom obliku ove metode, vraća se broj podnizova određen parametrom brojanja.

javni string Split (params char separator, StringSplitOptions opcije)

Javni string Split (razdjelnik nizova, opcije StringSplitOptions)

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

Javni string Split (razdjelnik nizova, int count, StringSplitOptions opcije)

U prva dva oblika metode Split(), pozivni niz se dijeli na dijelove i vraća se niz koji sadrži podnizove dobivene iz pozivajućeg niza. Znakovi koji razdvajaju ove podnizove se prosleđuju u nizu separatora. Ako je niz separatora prazan, tada se kao separator koristi razmak. I u trećem i četvrtom obliku ove metode, vraća se broj redova ograničen parametrom brojanja.

Ali u svim oblicima, parametar opcija specificira specifičan način rukovanja praznim redovima koji se proizvode kada su dva graničnika susjedna. Nabrajanje StringSplitOptions definira samo dvije vrijednosti: Nema I RemoveEmptyEntries. Ako je opcija None, tada su prazni nizovi uključeni u konačni rezultat podjele originalnog niza. A ako je parametar opcija postavljen na RemoveEmptyEntries, tada se prazni redovi isključuju iz konačnog rezultata cijepanja originalnog niza.

pridruži se() javni statički string Join (razdjelnik nizova, vrijednost niza)

Javni statički string Join (razdjelnik nizova, vrijednost niza, int startIndex, int count)

Konstruiše novi string kombinovanjem sadržaja niza nizova.

Prvi oblik metode Join() vraća string koji se sastoji od spojenih podnizova proslijeđenih u niz vrijednosti. Drugi oblik također vraća string koji se sastoji od podnizova proslijeđenih u niz vrijednosti, ali oni su spojeni u određenom broju brojeva, počevši od elementa niza vrijednosti. U oba oblika, svaki sljedeći red je odvojen od prethodnog reda separatorom koji je specificiran parametrom separatora.

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

Javni string Trim(params char trimChars)

Metoda koja vam omogućava da uklonite sva pojavljivanja određenog skupa znakova s ​​početka i kraja tekućeg reda.

Prvi oblik metode Trim() uklanja početne i zadnje razmake iz pozivajućeg niza. A drugi oblik ove metode uklanja početna i zadnja pojavljivanja niza pozivajućih znakova iz niza trimChars. Oba oblika vraćaju rezultujući niz.

PadLeft() javni niz PadLeft(int totalWidth)

Javni niz PadLeft(int totalWidth, char paddingChar)

Omogućava vam da unesete niz znakova na lijevoj strani.

Prvi oblik metode PadLeft() uvodi razmake na lijevoj strani pozivajućeg stringa tako da njegova ukupna dužina postaje jednaka vrijednosti parametra totalWidth. I u drugom obliku ove metode, znakovi označeni parametrom paddingChar unose se na lijevoj strani pozivajućeg stringa tako da njegova ukupna dužina postaje jednaka vrijednosti parametra totalWidth. Oba oblika vraćaju rezultujući niz. Ako je vrijednost parametra totalWidth manja od dužine pozivajućeg niza, tada se vraća kopija nepromijenjenog niza poziva.

PadRight() Isto kao PadLeft()

Omogućava vam da dodate string sa znakovima s desne strane.

Umetanje, brisanje i zamjena redova
Insert() javni string Insert(int startIndex, vrijednost stringa)

Koristi se za umetanje jednog reda u drugi, pri čemu vrijednost označava red koji treba umetnuti u pozivni red na startIndex. Metoda vraća rezultujući niz.

Ukloni() javni niz Ukloni (int startIndex)

Javni niz Ukloni (int startIndex, int count)

Koristi se za uklanjanje dijela niza. U prvom obliku metode Remove(), uklanjanje počinje na lokaciji označenoj startIndexom i nastavlja se do kraja reda. I u drugom obliku ove metode, broj znakova određen parametrom count se uklanja iz stringa, počevši od mjesta označenog indeksom startIndex.

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

Javni niz Zamijeni (niz oldValue, string novaValue)

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

Promijenite slučaj
ToUpper() javni niz ToUpper()

Piše velika slova u nizu poziva.

Spustiti() javni niz ToLower()

Sva slova u nizu za pozivanje napišite mala.

Dobivanje podniza iz niza
podniz() javni niz podniz (int startIndex)

Javni niz podniz (int startIndex, int dužina)

U prvom obliku metode Substring(), podniz se preuzima počevši od lokacije označene parametrom startIndex i završavajući na kraju pozivajućeg niza. A u drugom obliku ove metode izdvaja se podniz koji se sastoji od broja znakova određenih parametrom dužine, počevši od mjesta označenog parametrom startIndex.

Sljedeći primjer programa koristi nekoliko od gore navedenih metoda:

Korišćenje sistema; koristeći System.Collections.Generic; koristeći System.Linq; koristeći System.Text; imenski prostor ConsoleApplication1 ( klasa Program ( static void Main(string args) ( // Uporedite prva dva reda string s1 = "ovo je string"; string s2 = "ovo je tekst, a ovo je string"; if (String. CompareOrdinal(s1, s2) != 0) Console.WriteLine("Strings s1 i s2 nisu jednaki"); if (String.Compare(s1, 0, s2, 13, 10, true) == 0) Console.WriteLine ("Međutim, oni sadrže isti tekst"); // Povezivanje nizova Console.WriteLine(String.Concat("\n" + "Jedan, dva ","tri, četiri")); // Traži u nizu / / Prvo pojavljivanje podniza if (s2. IndexOf("this") != -1) Console.WriteLine("Riječ \"this\" pronađena u redu, ona je "+ "na: (0) poziciji" , s2.IndexOf("this")); / / Posljednje pojavljivanje podniza if (s2.LastIndexOf("this") != -1) Console.WriteLine("Posljednje pojavljivanje riječi \"this\" je " + "na (0) poziciji", s2.LastIndexOf("this" )); // Traži iz niza znakova char myCh = ("y","x","t"); if (s2.IndexOfAny (myCh) != -1) Console.WriteLine("Jedan od znakova iz niza ch "+ "nađen u trenutnoj liniji na poziciji (0)", s2.IndexOfAny(myCh)); // Određuje da li linija počinje datim podnizom if (s2.StartsWith("ovo je tekst") == true) Console.WriteLine("Podniz pronađen!"); // Odredite da li string sadrži podniz // koristeći primjer određivanja korisnikovog OS stringa myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Vaš operativni sistem je Windows XP"); else if (myOS.Contains("NT 6.1")) Console.WriteLine("Vaš operativni sistem je Windows 7"); Console.ReadLine(); ) ) )

Malo o poređenju stringova u C#

Vjerojatno najčešća od svih operacija niza znakova je poređenje jednog stringa s drugim. Prije nego što pogledamo bilo koje metode poređenja stringova, vrijedno je naglasiti sljedeće: Poređenje stringova može se obaviti u .NET Framework-u na dva glavna načina:

    Prvo, poređenje može odražavati običaje i norme određenog kulturnog okruženja, koje su često kulturna okruženja koja dolaze u obzir kada se program implementira. Ovo je standardno ponašanje za neke, ali ne za sve metode poređenja.

    I drugo, usporedba se može napraviti bez obzira na kulturološke postavke samo po rednim vrijednostima znakova koji čine niz. Uopšteno govoreći, nekulturna poređenja nizova koriste leksikografski poredak (i ​​jezičke karakteristike) da bi se utvrdilo da li je jedan niz veći, manji ili jednak drugom nizu. U ordinalnom poređenju, nizovi se jednostavno poredaju na osnovu nepromenjene vrednosti svakog znaka.

Zbog razlika u načinu na koji se razlikuju poređenja kulturoloških nizova i poređenja redova, kao i posljedica svakog takvog poređenja, toplo preporučujemo da slijedite najbolje prakse koje trenutno nudi Microsoft. Uostalom, odabir pogrešne metode za poređenje stringova može dovesti do pogrešnog rada programa kada radi u okruženju drugačijem od onog u kojem je razvijen.

Odabir načina upoređivanja znakovnih nizova je vrlo važna odluka. Kao opšte pravilo, i bez izuzetka, trebalo bi da izaberete da uporedite nizove na kulturološki osetljiv način ako se to radi u svrhu prikazivanja rezultata korisniku (na primer, za prikaz niza nizova sortiranih po leksikografskom redosledu). Ali ako stringovi sadrže fiksne informacije koje nisu namijenjene za modificiranje zbog kulturoloških razlika, kao što su naziv datoteke, ključna riječ, adresa web stranice ili sigurnosna vrijednost, tada biste trebali odabrati usporedbu rednih nizova. Naravno, karakteristike određene aplikacije koja se razvija će diktirati izbor odgovarajuće metode za poređenje nizova znakova.

Klasa String pruža razne metode poređenja stringova, koje su navedene u gornjoj tabeli. Najuniverzalniji među njima je Compare() metoda. Omogućava da se dva niza uporede u cijelosti ili djelomično, osjetljivo na velika i mala slova, na način određen parametrom tipa StringComparison, kao i kulturne informacije koje daje parametar tipa CultureInfo.

Ona preopterećenja metode Compare() koja ne uključuju parametar tipa StringComparison izvode poređenje znakovnih nizova osjetljivo na velika i mala slova i kulturu. A u onim preopterećenim varijantama koje ne sadrže parametar tipa CultureInfo, informacije o kulturnom okruženju određuju se trenutnim okruženjem vremena izvršavanja.

Tip StringComparison je enumeracija koja definira vrijednosti prikazane u tabeli ispod. Koristeći ove vrijednosti, možete kreirati poređenja nizova koja odgovaraju potrebama vaše specifične aplikacije. Stoga, dodavanje parametra tipa StringComparison proširuje mogućnosti metode Compare() i drugih metoda poređenja kao što je Equals(). Ovo također omogućava da se nedvosmisleno naznači kako se nizovi namjeravaju porediti.

Zbog razlika između kulturološki osjetljivih poređenja nizova i rednih poređenja, važno je biti što precizniji u ovom pogledu.

Vrijednosti definirane u nabrajanju StringComparison
Značenje Opis
CurrentCulture Poređenja nizova se vrše korištenjem trenutnih postavki kulturnog okruženja
CurrentCultureIgnoreCase Poređenja nizova se vrše korištenjem trenutnih postavki kulture, ali nisu osjetljiva na velika i mala slova
InvariantCulture Poređenja nizova se vrše korištenjem nepromjenjivih, tj. univerzalni podaci o kulturnom okruženju
InvariantCultureIgnoreCase Poređenja nizova se vrše korištenjem nepromjenjivih, tj. univerzalni kulturni podaci i bez obzira na velika i mala slova
Redni Poređenja nizova se vrše korištenjem rednih vrijednosti znakova u nizu. U tom slučaju leksikografski poredak može biti poremećen, a konvencije usvojene u određenom kulturnom okruženju se zanemaruju
OrdinalIgnoreCase Poređenja nizova se vrše korištenjem rednih vrijednosti znakova u nizu, ali nisu osjetljiva na velika i mala slova

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

Činjenica je da Compare() metoda određuje jednakost upoređenih nizova na osnovu njihovog redoslijeda sortiranja. Dakle, ako se napravi kulturološka poređenje između nizova, oba niza mogu biti ista u svom redoslijedu sortiranja, ali ne i jednaka u suštini. Po defaultu, jednakost stringova se određuje u metodi Equals(), na osnovu rednih vrijednosti znakova i bez uzimanja u obzir kulturnog okruženja. Prema tome, prema zadanim postavkama, oba niza se porede u ovoj metodi za apsolutnu jednakost znak po znak, slično kako se to radi u == operatoru.

Uprkos velikoj svestranosti metode Compare(), za jednostavna poređenja nizova znakova lakše je koristiti metodu CompareOrdinal(). Konačno, imajte na umu da metoda CompareTo() izvodi samo kulturološki osjetljiva poređenja nizova.

Sljedeći program demonstrira upotrebu metoda Compare(), Equals(), CompareOrdinal() i operatora == i != za poređenje znakovnih nizova. Imajte na umu da prva dva primjera poređenja jasno pokazuju razlike između kulturološki osjetljivih poređenja nizova i rednih poređenja u okruženju engleskog govornog područja:

Korišćenje sistema; Primjer klase ( static void Main() ( string str1 = "alpha"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alpha"; string str5 = "alpha, beta"; int rezultat; / / Prvo, pokažite razlike između poređenja stringova osjetljivih na kulturu // i rezultata poređenja redova = String.Compare(str1, str2, StringComparison.CurrentCulture); Console.Write("Kulturalno osjetljiva usporedba nizova: "); if (rezultat 0 ) Console.WriteLine(str1 + " veći od " + str2); inače Console.WriteLine(str1 + " jednako " + str2); rezultat = String.Compare(str1, str2, StringComparison.Ordinal); Console.Write(" Redovi za poređenje: "); if (rezultat 0) Console.WriteLine(str1 + " veći od " + str2); else Console.WriteLine(str1 + " jednako " + str4); // Koristite rezultat metode CompareOrdinal() = String.CompareOrdinal( str1, str2); Console.Write("Upoređivanje stringova pomoću metode CompareOrdinal():\n"); if (rezultat 0) Console.WriteLine(str1 + " veći od " + str2); inače Konzola .WriteLine(str1 + " jednako " + str4); Console.WriteLine(); // Odredite jednakost nizova pomoću == operatora // Ovo je ordinalno poređenje nizova znakova if (str1 == str4) Console.WriteLine(str1 + " == " + str4); // Definirajte nejednakost linija koristeći != operator if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Console.WriteLine(); // Izvrši rednu usporedbu nizova bez obzira na velika i mala slova // koristeći metodu Equals() if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Usporedba nizova pomoću metode Equals() sa " + "Parametar OrdinalIgnoreCase: \n" + str1 + " jednako " + str2); Console.WriteLine(); // Usporedi dijelove nizova if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Uporedi nizove uzimajući u obzir trenutno kulturno okruženje:" + "\n3 prvi znakovi niza " + str2 + " više od prva 3 znaka reda " + str5); ) ) )

Izvođenje ovog programa proizvodi sljedeći izlaz:

Najbolji članci na ovu temu