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:
- unesenu riječ trebate pretvoriti u velika slova:
#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:
- znak za uzimanje adrese ovdje nije potreban, budući da je naziv niza, kao što već znamo, adresa
- 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:
- int atoi (char *str)
- dugi atol (char *str)
- 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. |
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:
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(); ) ) )
![](https://i0.wp.com/professorweb.ru/my/csharp/charp_theory/level4/files/img0351.png)
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:
![](https://i0.wp.com/professorweb.ru/my/csharp/charp_theory/level4/files/img5800.png)
Najbolji članci na temu