Biblioteka e funksioneve C dhe C ++ përfshin një grup të pasur funksionesh për trajtimin e vargjeve dhe karaktereve. Funksionet e vargut funksionojnë në vargje të karaktereve të përfunduara me null. Në gjuhën C, për të përdorur funksionet e vargut, duhet të përfshini një skedar kokë në fillim të modulit të programit , dhe për skedarin simbolik - kokë ... C ++ përdor titujt për të punuar me vargjet dhe funksionet e karaktereve. dhe përkatësisht. Ky kapitull përdor emrat e titullit C për thjeshtësi.
Meqenëse në gjuhët C dhe C ++ kur kryeni operacione me vargje, nuk ka kontroll automatik të shkeljes së kufijve të tyre, e gjithë përgjegjësia për tejmbushjen e vargjeve bie mbi supet e programuesit. Neglizhimi i këtyre hollësive mund ta çojë programin në dështim.
Në C dhe C ++, karakteret e printueshme janë karakteret që shfaqen në terminal. Në mjediset ASCII, ato janë të vendosura midis një hapësire (0x20) dhe një tilde (OxFE). Karakteret e kontrollit kanë vlera midis zeros dhe Ox1F; këto përfshijnë gjithashtu simbolin DEL (Ox7F).
Historikisht, argumentet për funksionet simbolike janë vlera të plota, nga të cilat përdoret vetëm bajt më pak i rëndësishëm. Funksionet simbolike konvertojnë automatikisht argumentet e tyre në shkronja të panënshkruara. Sigurisht, ju jeni të lirë t'i thërrisni këto funksione me argumente simbolike, pasi simbolet ngrihen automatikisht në rangun e numrave të plotë kur thirret funksioni.
Në titull Përcaktohet lloji size_t, i cili është rezultat i operatorit sizeof dhe është një lloj numri i plotë i panënshkruar.
C99 ka shtuar kualifikuesin limit në disa parametra të disa funksioneve të përcaktuara fillimisht në C89. Çdo funksion i tillë do të diskutohet me prototipin e tij të përdorur në mjedisin C89 (si dhe në mjedisin C ++), dhe parametrat me atributin limit do të shënohen në përshkrimin e këtij funksioni.
Lista e veçorive
Kontrolli i përkatësisë
isalnum - Kontrolloni nëse një karakter është alfanumerik isalpha - Kontrolloni nëse një karakter i përket shkronjave isblank - Kontrolloni për një karakter bosh iscntrl - Kontrolloni nëse një simbol i përket kontrollit isdigit - Kontrolloni nëse një karakter është dixhital isgraph - Kontrolloni nëse një karakter është i printueshëm, por jo hapësirë islower - Kontrolloni nëse një karakter është i vogël isprint - Kontrolloni nëse një karakter është i printueshëm ispunct - Kontrolloni nëse një karakter i përket shenjave të pikësimit isspace - Kontrolloni nëse një karakter është hapësirë e bardhë isupper - Kontrolloni nëse një karakter është me shkronja të mëdha isxdigit - Kontrolloni nëse një karakter është heksadecimal
Puna me grupe karakteresh
memchr - Kaloni nëpër grup për të gjetur shfaqjen e parë të një karakteri memcmp - Krahason një numër të caktuar karakteresh në dy vargje memcpy - Kopjon karakteret nga një grup në tjetrin memmove - Kopjon karakteret nga një grup në tjetrin, duke marrë parasysh vargjet e mbivendosura memset - Plotëson një numër të caktuar karakteresh në një grup me një të dhënë
Manipulimi i vargut
strcat - Shtoji një kopje të një vargu në të dhënë strchr - Kthen një tregues në shfaqjen e parë të bajtit më pak të rëndësishëm të parametrit të dhënë strcmp - Krahason leksikografikisht dy vargje strcoll - Krahason një varg me tjetrin sipas setlocale strcpy - Kopjon përmbajtjen e një vargu në tjetrin strcspn - Kthen një varg pa karaktere të specifikuara strerror - Kthen një tregues në vargun që përmban mesazhin e gabimit të sistemit strlen - Rikthen gjatësinë e një vargu me fund të pavlefshëm
Nuk është rastësi që e vendosa temën për vargjet në seksionin "Arrays". Meqenëse një varg është, në fakt, një grup karakteresh. Ja një shembull:
char str = "Është thjesht një varg"; Për të kuptuar më mirë, i njëjti rresht mund të shkruhet kështu:
char str = ("E", "t", "o", "", "p", "p", "o", "s", "t", "o", "", "c", "t", "p", "o", "k", "a"); ato. i njëjti grup, i përbërë vetëm nga simbole. Prandaj, mund të punoni me të në të njëjtën mënyrë si me vargjet me numra të plotë. Tani le të provojmë punë me vargje në c... Në mësimet hyrëse, ne kuptuam se personazhet janë lloje të numrave të plotë, d.m.th. çdo karakter ka vlerën e vet numerike. Ja një shembull dhe një zgjidhje:
- ju duhet të konvertoni fjalën e futur në shkronja të mëdha:
#përfshi #përfshi Int kryesore ()
{ char str = "sergej";
str [i] - = 32;
} për (int i = 0; str [i]! = "\ 0"; i ++) ( printf ("% c", str [i]);
} getch (); Kthimi 0;
}
për të marrë kodin e numrit, thjesht përdorni specifikuesin% d në funksionin printf. Po, dhe një pikë më e rëndësishme: përfundimi i çdo vargjetështë një terminator null, i cili shënohet me karakterin special "\ 0".
Një mënyrë tjetër për të specifikuar një varg është ta deklaroni atë përmes char *. Ja një shembull:
char * str = "provod";
ato. krijohet një tregues drejt një vargu, i cili ndodhet diku në memorie. Dhe ja se si mund të futni vargje përmes operatorit tonë të skanimit:
char str; scanf ("% s", str);
Ka dy hollësi:
- shenja e marrjes së adresës nuk është e nevojshme këtu, pasi emri i grupit, siç e dimë tashmë, është adresa
- Gjatësia e vargut të hyrjes nuk duhet të kalojë 15 karaktere, pasi i fundit duhet të jetë një terminator null. Për më tepër, vetë përpiluesi do ta plotësojë këtë karakter pas karakterit të fundit të futur tuajin.
Meqenëse gjuha C është një gjuhë e strukturuar, tashmë ka funksione të integruara për duke punuar me vargje dhe me simbole. Për të përpunuar vargjet, duhet të përfshini një skedar: ctype.h. Skedari përmban funksione për përcaktimin e rastit, formatit të karakterit. Në thelb, çdo gjë që duhet të dini për një simbol mund të bëhet duke përdorur funksionet në skedarin ctype.h. Ndonjëherë mund t'ju duhet të konvertoni një varg në një lloj tjetër të dhënash. Biblioteka stdlib ekziston për përkthimin e vargjeve në lloje të tjera. Këtu janë funksionet e tij:
- int atoi (char * str)
- atoli i gjatë (char * str)
- atof të dyfishtë (char * str)
Ndonjëherë këto funksione janë shumë të dobishme, për shembull, kur ju duhet të nxirrni një vit ose një vlerë numerike nga një varg. Puna me vargje në c (s)është një temë shumë e rëndësishme, ndaj përpiquni ta kuptoni këtë mësim. |
Vargjet. Linjat I/O. I/O i formatuar. Përpunimi i vargjeve duke përdorur funksionet standarde C. Puna me memorie.
1.1. Deklarimi dhe inicializimi i vargjeve.
Një varg është një grup karakteresh që përfundon me karakterin bosh '\ 0'. Vargu deklarohet si një grup karakteresh të rregullt, për shembull
char s1; // varg i gjatë nëntë karaktere
char * s2; // tregues për vargun
Dallimi midis s1 dhe s2 është se s1 është një konstante e emërtuar dhe s2 është një ndryshore.
Konstantet e vargut janë të mbyllura në thonjëza të dyfishta, në krahasim me karakteret që janë të mbyllura në thonjëza të vetme. Për shembull,
"Ky është një varg."
Gjatësia e një konstante vargu nuk mund të kalojë 509 karaktere sipas standardit. Megjithatë, shumë zbatime lejojnë vargje më të gjata.
Gjatë inicializimit të vargjeve, është më mirë të mos specifikoni dimensionin e vargut; përpiluesi do ta bëjë këtë duke llogaritur gjatësinë e vargut dhe duke shtuar një në të. Për shembull,
char s1 = "Ky është një varg.";
Në gjuhën e programimit C, ka një numër të madh funksionesh për të punuar me vargje, prototipet e të cilave përshkruhen në skedarët e kokës stdlib.h dhe string.h. Puna me këto funksione do të diskutohet në paragrafët e mëposhtëm.
1.2. Linjat I/O.
Për të futur një varg nga tastiera, përdorni funksionin
char * merr (char * str);
i cili shkruan një varg në str dhe kthen adresën e vargut të futur. Funksioni ndalon hyrjen kur ndeshet me karakterin '\ n' ose EOF (fundi i skedarit). Karakteri i linjës së re nuk kopjohet. Një bajt zero vendoset në fund të rreshtit të leximit. Në rast të suksesit, funksioni kthen një tregues në vargun e lexuar, dhe në rast dështimi, NULL.
Për të nxjerrë një linjë në tastierë, përdorni funksionin standard
int puts (const char * s);
i cili kthen një numër jo negativ për suksesin dhe EOF në dështim.
Prototipet e funksionit merr dhe vendos përshkruhen në skedarin e kokës stdio.h.
#përfshi
printf ("Vargu i hyrjes:");
1.3. I/O i formatuar.
Për futjen e të dhënave të formatuara nga tastiera, përdorni funksionin
int scanf (konst char * format, ...);
i cili, nëse është i suksesshëm, kthen numrin e njësive të të dhënave të lexuara, dhe nëse jo, kthen EOF. Parametri i formatit duhet të tregojë në një varg të formatuar që përmban specifikimet e formateve hyrëse. Numri dhe llojet e argumenteve që ndjekin vargun e formatit duhet të përputhen me numrin dhe llojet e formateve hyrëse të specifikuara në vargun e formatit. Nëse ky kusht nuk plotësohet, atëherë rezultati i funksionit është i paparashikueshëm.
Hapësira, karakteret "\ t" ose "\ n" në vargun e formatit përshkruajnë një ose më shumë karaktere boshe në rrjedhën hyrëse, të cilat përfshijnë karaktere: hapësirë, '\ t', '\ n', '\ v', '\ f'. Funksioni i skanimit kapërcen karakteret bosh në rrjedhën e hyrjes.
Karakteret literale në vargun e formatit, me përjashtim të karakterit %, kërkojnë saktësisht të njëjtat karaktere që të shfaqen në rrjedhën hyrëse. Nëse nuk ka një karakter të tillë, atëherë scanf ndalon hyrjen. Funksioni scanf kapërcen karakteret fjalë për fjalë.
Në përgjithësi, specifikimi i formatit të hyrjes është:
Lloji % [*] [width] [modifikuesit]
Karakteri '*' tregon kapërcimin kur futet në një fushë të përcaktuar nga ky specifikim;
- "gjerësia" përcakton numrin maksimal të karaktereve të futura sipas këtij specifikimi;
Lloji mund të marrë vlerat e mëposhtme:
c - grup karakteresh,
s - varg karakteresh, vargjet ndahen me karaktere bosh,
d - numër i plotë i nënshkruar në 10 s / s,
i është një numër i plotë i nënshkruar, sistemi i numrave varet nga dy shifrat e para,
u - numër i plotë i panënshkruar në 10 s/s,
o - numër i plotë i panënshkruar në 8 s/s,
x, X - numër i plotë i panënshkruar në 16 s / s,
e, E, f, g, G - numër lundrues,
p është një tregues për një tregues,
n është një tregues për një numër të plotë,
[...] - grup karakteresh të skanuar, për shembull,.
Në rastin e fundit, vetëm karakteret e mbyllura në kllapa katrore do të futen nga rrjedha e hyrjes. Nëse karakteri i parë brenda kllapave katrore është '^', atëherë futen vetëm ato karaktere që nuk janë në grup. Gama e karaktereve në grup specifikohet duke përdorur simbolin '-'. Kur futni karaktere, futen edhe boshllëqet kryesore dhe bajt-i null përfundimtar i vargut.
Modifikuesit mund të marrin vlerat e mëposhtme:
h - numër i plotë i shkurtër,
l, L - numër i plotë i gjatë ose notues,
dhe përdoren vetëm për numra të plotë ose notues.
Shembulli i mëposhtëm tregon rastet e përdorimit për funksionin scanf. Vini re se ka një hapësirë përpara specifikuesit të formatit, duke filluar me hyrjen e numrit lundrues.
#përfshi
printf ("Fut një numër të plotë:");
scanf ("% d", & n);
printf ("Fut një double:");
scanf ("% lf", & d);
printf ("Fut një char:");
scanf ("% c", & c);
printf ("Fut një varg:");
scanf ("% s", & s);
Vini re se në këtë program inicializohet numri i pikës lundruese. Kjo bëhet në mënyrë që përpiluesi të përfshijë bibliotekën për të mbështetur punën me numrat lundrues. Dështimi për ta bërë këtë do të rezultojë në një gabim në kohën e ekzekutimit kur futni një numër lundrues.
Për dalje të formatuar në tastierë, përdorni funksionin
int printf (konst char * format, ...);
i cili, nëse është i suksesshëm, kthen numrin e njësive të daljes së të dhënave, dhe nëse jo, kthen EOF. Parametri i formatit është një varg i formatuar që përmban specifikime për formatet e daljes. Numri dhe llojet e argumenteve që ndjekin vargun e formatit duhet të përputhen me numrin dhe llojet e specifikimeve të formatit të daljes të dhëna në vargun e formatit. Në përgjithësi, specifikimi i formatit të daljes është:
% [flamujt] [gjerësia] [. saktësi] [modifikuesit] lloji
- "flamujt" janë simbole të ndryshme që specifikojnë formatin e daljes;
- "gjerësia" përcakton numrin minimal të karaktereve të shfaqura sipas këtij specifikimi;
- '.precision' përcakton numrin maksimal të karaktereve që do të shfaqen;
- 'modifikuesit' specifikojnë llojin e argumenteve;
- 'lloji' përcakton llojin e argumentit.
Numrat e plotë të nënshkruar dalin në formatin e mëposhtëm:
% [-] [+ | hapësirë] [gjerësia] [l] d
- - shtrirje në të majtë, si parazgjedhje - në të djathtë;
+ - shfaqet shenja '+', vini re se për numrat negativë shfaqet gjithmonë shenja '-';
'Hapësirë' - një hapësirë shfaqet në pozicionin e karakterit;
d - lloji i të dhënave int.
Formati i mëposhtëm i daljes përdoret për të nxjerrë numra të plotë të panënshkruar:
% [-] [#] [gjerësia] [l]
# - fillestari 0 shfaqet për numrat në 8 c / s, ose fillestari 0x ose 0X për numrat në 16 c / s,
l - modifikues i llojit të të dhënave të gjata;
u - numër i plotë në 10c / s,
o - numër i plotë në 8 s / s,
x, X është një numër i plotë prej 16 s / s.
Për numrat me pikë lundruese, përdoret formati i mëposhtëm i daljes:
% [-] [+ | hapësirë] [gjerësia] [. saktësi]
"precision" tregon numrin e shifrave pas pikës dhjetore për formatet f, e dhe E, ose numrin e shifrave domethënëse për formatet g dhe G. Numrat janë të rrumbullakosura. Parazgjedhja është gjashtë shifra dhjetore;
f - numri i pikës fikse,
e - një numër në formë eksponenciale, eksponenti shënohet me shkronjën "e",
E - një numër në formë eksponenciale, eksponenti shënohet me shkronjën "E",
g - më i shkurtri nga formatet f ose g,
G është më i shkurtri nga formatet f ose G.
printf ("n =% d \ n f =% f \ n e =% e \ n E =% E \ n f =% .2f", -123, 12.34, 12.34, 12.34, 12.34);
// printime: n = 123 f = 12,340000 e = 1,234000e + 001 E = 1,234000E + 001 f = 12,34
1.4. Formatimi i vargjeve.
Ekzistojnë variante të funksioneve scanf dhe printf për formatimin e vargjeve dhe quhen përkatësisht sscanf dhe sprintf.
int sscanf (const char * str, const char * format, ...);
lexon të dhënat nga vargu i specifikuar nga parametri str sipas vargut të formatit të specifikuar nga parametri i formatit. Rikthen sasinë e të dhënave të lexuara për suksesin dhe EOF për dështimin. Për shembull,
#përfshi
char str = "a 10 1.2 String Nuk ka hyrje";
sscanf (str, "% c% d% lf% s", & c, & n, & d, s);
printf ("% c \ n", c); // printon: a
printf ("% d \ n", n); // printime: 10
printf ("% f \ n", d); // printime: 1.200000
printf ("% s \ n", s); // printime: Varg
int sprintf (char * buffer, const char * format, ...);
formaton vargun sipas formatit të specifikuar nga parametri i formatit dhe e shkruan rezultatin në buferin e grupit të karaktereve. Funksioni kthen numrin e karaktereve të shkruara në buferin e grupit të karaktereve, duke përjashtuar bajtin null përfundimtar. Për shembull,
#përfshi
char str = "c =% c, n =% d, d =% f, s =% s";
char s = "Ky është një varg.";
sprintf (buffer, str, c, n, d, s);
printf ("% s \ n", buffer); // printon: c = c, n = 10, d = 1.200000, s = Ky është një varg
1.5. Konvertimi i vargjeve në të dhëna numerike.
Prototipet e funksioneve për konvertimin e vargjeve në të dhëna numerike jepen në skedarin e kokës stdlib.h, i cili duhet të përfshihet në program.
Për të kthyer një varg në një numër të plotë, përdorni funksionin
int atoi (const char * str);
char * str = “-123”;
n = atoi (rr); // n = -123
Për të kthyer një varg në një numër të plotë të gjatë, përdorni funksionin
gjatë int atolit (const char * str);
i cili, nëse është i suksesshëm, kthen një numër të plotë në të cilin është konvertuar vargu str, dhe nëse 0 dështon, për shembull,
char * str = “-123”;
n = atol (rr); // n = -123
Për të kthyer një varg në një të dyfishtë, përdorni funksionin
atof i dyfishtë (const char * str);
i cili, nëse është i suksesshëm, kthen një numër lundrues të tipit double, në të cilin është konvertuar vargu str, dhe nëse 0 dështon, për shembull,
char * str = “-123,321”;
n = atof (str); // n = -123.321
Funksionet e mëposhtme kryejnë veprime të ngjashme me funksionet atoi, atol, atof, por ofrojnë veçori më të avancuara.
gjatë int strtol (konst char * str, char ** endptr, bazë int);
konverton vargun str në një int të gjatë, të cilin e kthen. Parametrat e këtij funksioni kanë kuptimin e mëposhtëm.
Nëse baza është 0, atëherë konvertimi varet nga dy karakteret e para të str:
Nëse karakteri i parë është një shifër nga 1 në 9, atëherë supozohet se numri përfaqësohet në 10 s / s;
Nëse karakteri i parë është një shifër 0 dhe e dyta është një shifër nga 1 në 7, atëherë supozohet se numri përfaqësohet në 8 c / s;
Nëse karakteri i parë është 0 dhe i dyti është "X" ose "x", supozohet se numri përfaqësohet në 16 c / s.
Nëse baza është një numër midis 2 dhe 36, atëherë kjo vlerë merret si bazë e bazës dhe çdo karakter jashtë kësaj baze ndalon konvertimin. Baza 11 deri në 36 përdor karakteret 'A' në 'Z' ose 'a' në 'z' për të paraqitur numrat.
Argumenti endptr vendoset nga funksioni strtol. Kjo vlerë përmban një tregues për karakterin që ndaloi konvertimin e str. Nëse është i suksesshëm, funksioni strtol kthen numrin e konvertuar dhe nëse dështon, kthen 0. Për shembull,
n = strtol (“12a”, & p, 0);
printf (“n =% ld,% stop =% c, n, * p); // n = 12, ndalim = a
n = strtol (“012b”, & p, 0);
printf (“n =% ld,% stop =% c, n, * p); // n = 10, ndalim = b
n = strtol (“0x12z”, & p, 0);
printf (“n =% ld,% stop =% c, n, * p); // n = 18, ndalim = z
n = strtol (“01117”, & p, 0);
printf (“n =% ld,% stop =% c, n, * p); // n = 7, ndalesa = 7
i panënshkruar i gjatë int strtol (const char * str, char ** endptr, int bazë);
funksionon në mënyrë të ngjashme me strtol, por konverton paraqitjen e karaktereve të një numri në një int të gjatë të panënshkruar.
dyfish strtod (const char * str, char ** endptr);
konverton paraqitjen e karaktereve të një numri në një dyfish.
Të gjitha funksionet e renditura në këtë paragraf ndalojnë punën e tyre kur ndeshen me karakterin e parë që nuk i përshtatet formatit të numrit në fjalë.
Përveç kësaj, nëse vlera e karakterit të një numri tejkalon diapazonin e vlerave të vlefshme për llojin përkatës të të dhënave, atëherë funksionet atof, strtol, strtoul, strtod vendosin vlerën e ndryshores errno në ERANGE. Ndryshorja errno dhe konstanta ERANGE përcaktohen në skedarin e kokës math.h. Në këtë rast, funksionet atof dhe strtod kthejnë vlerën HUGE_VAL, funksioni strtol kthen vlerën LONG_MAX ose LONG_MIN dhe funksioni strtoul kthen vlerën ULONG_MAX.
Funksionet jo standarde itoa, ltoa, utoa, ecvt, fcvt dhe gcvt mund të përdoren për të kthyer të dhënat numerike në vargje karakteresh. Por është më mirë të përdorni funksionin standard sprintf për këto qëllime.
1.6. Funksionet standarde për të punuar me vargje.
Ky seksion përshkruan funksionet për të punuar me vargje, prototipet e të cilave përshkruhen në vargun e skedarit të kokës.h.
1. Krahasimi i vargjeve. Funksionet strcmp dhe strncmp përdoren për të krahasuar vargjet.
int strcmp (const char * str1, const char * str2);
krahason leksikografikisht str1, str2 dhe kthen –1, 0, ose 1 nëse str1 është, përkatësisht, më e vogël, e barabartë me, ose më e madhe se str2.
int strncmp (const char * str1, const char * str2, size_t n);
Krahason leksikografikisht më së shumti n karaktere të para nga str1 dhe str2. Funksioni kthen -1, 0 ose 1 nëse n karakteret e para nga vargu str1 janë përkatësisht më të vogla, të barabarta ose më të mëdha se n karakteret e para nga vargu str2.
// shembull i krahasimit të vargjeve
#përfshi
#përfshi
char str1 = "aa bb";
char str2 = "aa aa";
char str3 = "aa bb cc";
printf ("% d \ n", strcmp (str1, str3)); // printime: -1
printf ("% d \ n", strcmp (str1, str1)); // printime: -0
printf ("% d \ n", strcmp (str1, str2)); // printime: 1
printf ("% d \ n", strncmp (str1, str3, 5)); // printime: 0
2. Linjat e kopjimit. Funksionet strcpy dhe strncpy përdoren për të kopjuar vargjet.
char * strcpy (char * str1, const char * str2);
kopjon vargun str2 në vargun str1. I gjithë vargu str2 kopjohet, duke përfshirë bajtin null fundor. Funksioni kthen një tregues në str1. Nëse linjat mbivendosen, rezultati është i paparashikueshëm.
char * strncpy (char * str1, const char * str2, madhësia_t n);
kopjon n karaktere nga vargu str2 në vargun str1. Nëse vargu str2 përmban më pak se n karaktere, atëherë bajti i fundit null kopjohet aq herë sa nevojitet për të zgjeruar vargun str2 në n karaktere. Funksioni kthen një tregues në vargun str1.
char str2 = "Kopjo vargun.";
strcpy (str1, str2);
printf (str1); // printime: Kopjo vargun.
4. Lidhja e vargjeve. Funksionet strcat dhe strncat përdoren për të lidhur vargjet në një varg.
char * strcat (char * str1, const char * str2);
shton vargun str2 në vargun str1, me bajtin null përfundimtar të vargut str1 të fshirë. Funksioni kthen një tregues në vargun str1.
char * strncat (char * str1, const char * str2, madhësia_t n);
shton n karaktere nga vargu str2 në vargun str1 dhe bajt-i null përfundimtar i vargut str1 fshihet. Funksioni kthen një tregues në vargun str1. nëse gjatësia e vargut str2 është më e vogël se n, atëherë bashkohen vetëm karakteret e përfshira në vargun str2. Pas bashkimit të vargjeve, një bajt zero i shtohet gjithmonë str1. Funksioni kthen një tregues në vargun str1.
#përfshi
#përfshi
char str1 = "String";
char str2 = "catenation";
char str3 = "Po Jo";
strcat (str1, str2);
printf ("% s \ n", str1); // printime: Katenacioni i vargut
strncat (str1, str3, 3);
printf ("% s \ n", str1); // printime: Katenacioni i vargut Po
5. Kërkoni për një karakter në një varg. Funksionet strchr, strrchr, strspn, strcspn dhe strpbrk përdoren për të kërkuar një karakter në një varg.
char * strchr (const char * str, int c);
kërkon shfaqjen e parë të karakterit të specifikuar nga parametri c në vargun str. Në rast të suksesit, funksioni kthen një tregues në karakterin e parë të gjetur dhe në rast dështimi, NULL.
char * strrchr (const char * str, int c);
kërkon shfaqjen e fundit të karakterit të specifikuar nga parametri c në vargun str. Nëse është i suksesshëm, funksioni kthen një tregues në karakterin e fundit të gjetur, dhe nëse nuk ka sukses, ai kthen NULL.
#përfshi
#përfshi
char str = "Kërkimi i karaktereve";
printf ("% s \ n", strchr (str, "r")); // printime: r kërkim
printf ("% s \ n", strrchr (str, "r")); // printime: rch
size_t strspn (const char * str1, const char * str2);
kthen indeksin e karakterit të parë nga vargu str1 që nuk është në vargun str2.
size_t strcspn (const char * str1, const char * str2);
kthen indeksin e karakterit të parë nga vargu str1 që shkon në vargun str2.
char str = "123 abc";
printf ("n =% d \ n", strspn (str, "321"); // printon: n = 3
printf ("n =% d \ n", strcspn (str, "cba"); // printon: n = 4
char * strpbrk (const char * str1, const char * str2);
gjen karakterin e parë në vargun str1 që është i barabartë me një nga karakteret në vargun str2. Në rast të suksesit, funksioni kthen një tregues në këtë karakter, dhe në rast dështimi, NULL.
char str = "123 abc";
printf ("% s \ n", strpbrk (str, "bca")); // printime: abc
6. Krahasimi i vargjeve. Funksioni strstr përdoret për të krahasuar vargjet.
char * strstr (const char * str1, const char * str2);
gjen shfaqjen e parë të vargut str2 (pa bajt të pavlefshëm pasues) në vargun str1. Në rast të suksesit, funksioni kthen një tregues në nënvargun e gjetur, dhe në rast dështimi, NULL. Nëse treguesi str1 tregon një varg me gjatësi zero, funksioni kthen treguesin str1.
char str = "123 abc 456;
printf ("% s \ n", strstr (str, "abc"); // print: abc 456
7. Parimi i vargut në shenja. Funksioni strtok përdoret për të analizuar një varg në shenja.
char * strtok (char * str1, const char * str2);
kthen një tregues në shenjën (fjalën) tjetër në vargun str1, në të cilin shenjat kufizohen me karaktere nga vargu str2. Nëse leksema mbarojnë, funksioni kthen NULL. Në thirrjen e parë në funksionin strtok, parametri str1 duhet të tregojë një varg që analizohet në token, dhe në thirrjet pasuese, ky parametër duhet të vendoset në NULL. Pas gjetjes së tokenit, funksioni strtok shkruan një bajt zero pas këtij tokeni në vend të ndarësit.
#përfshi
#përfshi
char str = "12 34 ab cd";
p = strtok (rr, "");
printf ("% s \ n", p); // printon në një kolonë vlerat: 12 34 ab cd
p = strtok (NULL, "");
8. Përcaktimi i gjatësisë së vargut. Funksioni strlen përdoret për të përcaktuar gjatësinë e një vargu.
madhësia_t strlen (konst char * str);
kthen gjatësinë e vargut, duke përjashtuar bajtin e fundit null. Për shembull,
char str = "123";
printf ("len =% d \ n", strlen (str)); // printime: len = 3
1.7. Funksionet për të punuar me kujtesën.
Skedari i kokës string.h përshkruan gjithashtu funksione për të punuar me blloqe memorie, të cilat janë të ngjashme me funksionet përkatëse për punën me vargjet.
void * memchr (const void * str, int c, size_t n);
kërkon shfaqjen e parë të karakterit të specifikuar nga parametri c në n bajt të str.
int memcmp (const void * str1, const void * str2, size_t n);
krahason n bajtin e parë të str1 dhe str2.
void * memcpy (const void * str1, const void * str2, size_t n);
kopjon n bajtin e parë nga vargu str1 në vargun str2.
void * memmove (const void * str1, const void * str2, size_t n);
kopjon n bajtin e parë nga vargu str1 në vargun str2, duke siguruar që vargjet e mbivendosura të trajtohen në mënyrë korrekte.
void * memset (const void * str, int c, size_t n);
kopjon karakterin e specifikuar nga parametri c në n bajtin e parë të str.
34
--- C # Manual --- Strings
Për sa i përket programimit të rregullt, vargu lloji i të dhënave të vargutështë një nga më të rëndësishmet në C #. Ky lloj përcakton dhe mbështet vargjet e karaktereve. Në një numër të gjuhëve të tjera programimi, një varg është një grup karakteresh. Dhe në C #, vargjet janë objekte. Prandaj, lloji i vargut është një lloj referimi.
Ndërtimi i vargjeve
Mënyra më e lehtë për të ndërtuar një varg karakteresh është përdorimi i një vargu literal. Për shembull, linja e mëposhtme e kodit cakton variablin e referencës së vargut str në referencën literale të vargut:
String str = "Starg mostër";
Në këtë rast, ndryshorja str inicializohet me sekuencën e karaktereve "Shargu Shembull". Ju gjithashtu mund të krijoni një objekt të tipit varg nga një grup i tipit char. Për shembull:
Char chararray = ("e", "x", "a", "m", "p", "l", "e"); string str = varg i ri (chararray);
Pasi të krijohet një objekt i tipit string, ai mund të përdoret kudo ku kërkohet një varg teksti i cituar.
Qëndrueshmëria e vargut
Mjaft e çuditshme, përmbajtja e një objekti të tipit string nuk mund të ndryshohet. Kjo do të thotë që pasi të krijohet, sekuenca e karaktereve nuk mund të ndryshohet. Por ky kufizim kontribuon në një zbatim më efikas të vargjeve të karaktereve. Prandaj, ky, në shikim të parë, disavantazh i dukshëm në fakt kthehet në një avantazh. Pra, nëse kërkohet një varg si variacion i një vargu ekzistues, atëherë për këtë qëllim duhet të krijohet një varg i ri që përmban të gjitha ndryshimet e nevojshme. Dhe meqenëse objektet e vargjeve të papërdorura grumbullohen automatikisht mbeturina, as nuk duhet të shqetësoheni për fatin e vargjeve të panevojshme.
Sidoqoftë, duhet theksuar se referencat e vargut të variablave (d.m.th., objektet e tipit string) janë subjekt ndryshimi dhe për këtë arsye ato mund t'i referohen një objekti tjetër. Por përmbajtja e vetë objektit të vargut nuk ndryshon pas krijimit të tij.
Le të shqyrtojmë një shembull:
Void statik addNewString () (string s = "Kjo është goditja ime"; s = "Kjo është goditje e re";)
Le të përpilojmë aplikacionin dhe të ngarkojmë asamblenë që rezulton në programin ildasm.exe. Figura tregon kodin CIL që do të gjenerohet për metodën void addNewString ():
Vini re se ka thirrje të shumta në kodin optik ldstr (ngarkesa e linjës). Ky kod optik CIL ldstr udhëzon të ngarkojë një objekt të ri vargu në grumbullin e menaxhuar. Si rezultat, objekti i mëparshëm që përmbante vlerën "This is my stroke" përfundimisht do të mblidhet mbeturina.
Puna me vargje
Në klasë Sistemi.String ofrohet një grup metodash për përcaktimin e gjatësisë së të dhënave të karaktereve, gjetjen e një nënvargu në vargun aktual, konvertimin e karaktereve nga shkronja të mëdha në të vogla dhe anasjelltas, etj. Ne do ta shikojmë këtë klasë në më shumë detaje në vijim.
Fusha e vargut, Indeksuesi dhe Vetia
Klasa String ka një fushë të vetme të përcaktuar:
String publik statik vetëm për lexim Bosh;
Fusha Empty tregon një varg bosh, d.m.th. një varg që nuk përmban karaktere. Kjo është në kontrast me një referencë boshe të vargut, e cila thjesht i bëhet një objekti joekzistent.
Përveç kësaj, klasa String përcakton një indeksues të vetëm vetëm për lexim:
Shënoni publikisht këtë (merrni;)
Ky indeksues ju lejon të merrni karakterin në indeksin e specifikuar. Indeksimi i vargjeve, si vargjet, fillon me zero. Objektet e vargut janë të qëndrueshëm dhe të pandryshueshëm, kështu që ka kuptim që klasa String të mbështesë një indeksues vetëm për lexim.
Më në fund, klasa String përcakton një veti të vetme vetëm për lexim:
Gjatësia e inteve publike (merr;)
Vetia Length kthen numrin e karaktereve në një varg. Shembulli i mëposhtëm tregon përdorimin e një indeksuesi dhe vetisë Length:
Përdorimi i Sistemit; Klasa Shembull (static void Main () (string str = "String Simple"; // Merrni gjatësinë e vargut dhe karakterin e 6-të në varg duke përdorur indeksuesin Console.WriteLine ("Gjatësia e vargut është (0), karakteri i 6-të është" (1) "" , str.Gjatësia, str);))
Operatorët e klasës së vargut
Klasa String mbingarkon dy operatorët e mëposhtëm: == dhe! =. Operatori == përdoret për të testuar dy vargje karakteresh për barazi. Kur operatori == aplikohet në referencat e objekteve, ai zakonisht kontrollon për të parë nëse të dy referencat janë bërë në të njëjtin objekt. Dhe kur operatori == zbatohet për referencat e objekteve të tipit String, atëherë përmbajtja e vetë vargjeve krahasohet për barazi. E njëjta gjë vlen edhe për operatorin!=. Kur zbatohet për referenca për objektet e tipit String, përmbajtja e vargjeve në vetvete krahasohet për pabarazi. Në të njëjtën kohë, operatorë të tjerë relacionalë, duke përfshirë =, krahasojnë referencat me objektet e tipit String në të njëjtën mënyrë si me objektet e llojeve të tjera. Dhe për të kontrolluar nëse një varg është më i madh se tjetri, duhet të thërrisni metodën Krahasoni (), e cila përcaktohet në klasën String.
Siç do të bëhet e qartë, shumë krahasime të vargjeve të karaktereve përdorin informacion kulturor. Por kjo nuk vlen për operatorët == dhe! =. Në fund të fundit, ata thjesht krahasojnë vlerat rendore të karaktereve në vargje. (Me fjalë të tjera, ata krahasojnë vlerat binare të karaktereve që nuk janë modifikuar kulturalisht, d.m.th., të kulturuara.) Prandaj, këta operatorë kryejnë krahasime të vargjeve në një mënyrë të pandjeshme ndaj rasteve dhe kulturës.
Metodat e klasës së vargut
Tabela e mëposhtme rendit disa nga metodat më interesante të kësaj klase, të grupuara sipas qëllimit:
Metodat për të punuar me vargje Metoda |
Struktura dhe mbingarkesat |
Emërimi |
---|
Krahasoni vargjet
|
Krahaso ()
|
int statike publike Krahaso (strA string, string strB) Krahaso publik statik int (strA string, string strB, bool ignoreCase) Krahasimi statik publik (strA string, string strB, StringComparison Type krahasimi) Krahasimi statik publik (strA string, string strB, bool ignoreCase, CultureInfo Culture) |
Metoda statike, krahason vargun strA me vargun strB. Jep një vlerë pozitive nëse strA është më e madhe se strB; vlerë negative nëse vargu strA është më i vogël se vargu strB; dhe zero nëse strA dhe strB janë të barabarta. Krahasimi është i ndjeshëm ndaj rasteve dhe i ndjeshëm nga ana kulturore.
Nëse ignoreCase është vlera Boolean e vërtetë, krahasimi injoron ndryshimin midis shkronjave të mëdha dhe të vogla. Përndryshe, këto dallime merren parasysh.
Parametri ComparationType specifikon një mënyrë specifike për të krahasuar vargjet. Klasa CultureInfo përcaktohet në hapësirën e emrave System.Globalization.
|
int statike publike Krahaso (strA, int indexA, varg strB, int indexB, gjatësi int) Krahasoni int statike publike (strA, int indexA, varg strB, int indexB, gjatësia int, bool ignoreCase) Krahasimi publik statik int (vargu strA, int indexA, vargu strB, int indexB, gjatësia int, Lloji i krahasimit të vargut) Krahaso int statike publike (strA, int indexA, varg strB, int indexB, gjatësia int, bool ignoreCase, Kultura e CultureInfo) |
Krahason pjesët e vargjeve strA dhe strB. Krahasimi fillon me elementët e vargut strA dhe strB dhe përfshin numrin e karaktereve të specifikuara nga parametri i gjatësisë. Metoda kthen një vlerë pozitive nëse pjesa e vargut strA është më e madhe se pjesa e vargut strB; vlerë negative nëse një pjesë e vargut strA është më e vogël se një pjesë e vargut strB; dhe zero nëse pjesët e krahasuara të strA dhe strB janë të barabarta. Krahasimi është i ndjeshëm ndaj rasteve dhe i ndjeshëm nga ana kulturore.
|
Krahasoni rendore ()
|
int statike publike KrahasimiOrdinal (strA string, vargu strB) Int statike publike CompareOrdinal (strA strA, int indexA, string strB, int indexB, int count) |
Bën të njëjtën gjë si metodën Krahaso (), por shpërfill cilësimet lokale
|
Krahaso me ()
|
publike int CompareTo (vlera e objektit)
|
Krahason vargun thirrës me paraqitjen e vargut të objektit të vlerës. Kthen një vlerë pozitive nëse vargu thirrës është më i madh se vlera e vargut; vlerë negative nëse vargu thirrës është më i vogël se vlera e vargut; dhe zero nëse vargjet e krahasuara janë të barabarta
|
publike int CompareTo (strB string)
|
Krahason vargun thirrës me vargun strB
|
E barabartë ()
|
anulimi publik bool Është i barabartë (objekt obj)
|
E kthen vlerën Boolean true nëse vargu thirrës përmban të njëjtën sekuencë karakteresh si paraqitja e vargut të obj. Kryen një krahasim rendor të ndjeshëm ndaj rasave, por të pandjeshëm ndaj kulturës
|
bool publike Është e barabartë (vlera e vargut) Bool publike është e barabartë (vlera e vargut, Lloji i krahasimit të vargut) |
E kthen vlerën Boolean true nëse vargu thirrës përmban të njëjtën sekuencë karakteresh si vlera e vargut. Bëhet një krahasim rendor i ndjeshëm ndaj rasteve, por i pandjeshëm ndaj kulturës. Parametri ComparationType përcakton një mënyrë specifike për të krahasuar vargjet
|
bool statike publike Është e barabartë (vargu a, vargu b) Bool statike publike Është e barabartë (vargu a, vargu b, Lloji i krahasimit të vargut) |
E kthen vlerën boolean true nëse vargu a përmban të njëjtën sekuencë karakteresh si vargu b. Bëhet një krahasim rendor i ndjeshëm ndaj rasteve, por i pandjeshëm ndaj kulturës. Parametri ComparationType përcakton një mënyrë specifike për të krahasuar vargjet
|
Lidh (bashkoj) vargjet
|
Concat ()
|
string publik statik Concat (string str0, string str1); string publik statik Concat (params vlerat e vargut); |
Kombinon shembuj të veçantë të vargjeve në një varg (lidhje) |
Kërko në varg
|
Përmban ()
|
bool publik Përmban (vlera e vargut)
|
Një metodë që ju lejon të përcaktoni nëse një varg përmban një nënvarg (vlerë) të veçantë |
FillonMe ()
|
bool publike StartsWith (vlera e vargut) Bool publike StartsWith (vlera e vargut, Lloji i krahasimit të vargut) |
E kthen vlerën boolean true nëse vargu thirrës fillon me vlerën e nënvargut. Përndryshe, vlera Boolean false kthehet. Parametri ComparationType specifikon se si kryhet kërkimi.
|
PërfundonMe ()
|
bool publik EndsWith (vlera e vargut) Bool publike EndsWith (vlera e vargut, Lloji i krahasimit të vargut) |
E kthen vlerën boolean true nëse vargu thirrës përfundon me vlerën e nënvargut. Përndryshe, ai kthen vlerën boolean false. Parametri ComparationType specifikon një metodë specifike kërkimi
|
Indeksi i ()
|
IndexOf publik (vlera e karakterit) Int int publik IndexOf (vlera e vargut) |
Gjen shfaqjen e parë të një nënvargu ose karakteri të caktuar në një varg. Nëse karakteri ose nënvargu i dëshiruar nuk gjendet, atëherë vlera -1 kthehet
|
publik int IndexOf (vlera char, int startIndex) Int publik IndexOf (vlera e vargut, int startIndex) Int int Publik IndexOf (vlera char, int startIndex, int count) Int int publik IndexOf (vlera e vargut, int startIndex, int count) |
Rikthen indeksin e shfaqjes së parë të karakterit ose vlerës së nënvargut në vargun thirrës. Kërkimi fillon me elementin në indeksin startIndex dhe shtrihet mbi numrin e elementeve të identifikuar nga numërimi (nëse ofrohet). Metoda kthen -1 nëse karakteri i kërkimit ose nënvargu nuk gjendet
|
Indeksi i Fundit ()
|
Versionet e mbingarkuara janë të ngjashme me metodën IndexOf (). |
Njësoj si IndexOf, por gjen shfaqjen e fundit të një karakteri ose nënvargu, jo të parën
|
IndexOfAny ()
|
int int publik IndexOfAny (char anyOf) Int int Public IndexOfAny (char anyOf, int startIndex) Int int Public IndexOfAny (char anyOf, int startIndex, int count) |
Kthen indeksin e shfaqjes së parë të çdo karakteri në grupin anyOf që gjendet në vargun thirrës. Kërkimi fillon në elementin në indeksin startIndex dhe përfshin numrin e elementeve të identifikuar nga numërimi (nëse ka). Metoda kthen -1 nëse nuk gjendet asnjë përputhje me ndonjë nga karakteret nga grupi anyOf. Kontrolli kryhet në mënyrë të rregullt.
|
Indeksi i Fundit i Cilido
|
Versionet e mbingarkuara janë të ngjashme me metodën IndexOfAny (). |
Kthen indeksin e shfaqjes së fundit të çdo karakteri nga grupi anyOf që gjendet në vargun thirrës
|
Ndarja dhe bashkimi i vargjeve
|
Ndarë
|
Ndarja e vargut publik (ndarësi i shenjave params) Ndarja e vargut publik (params ndarës i karaktereve, numërimi int) |
Një metodë që kthen një varg vargjesh me nënvargje të pranishme në këtë rast, të ndara nga njëri-tjetri nga elementë nga grupi i specifikuar char ose vargu.
Në formën e parë të metodës Split (), vargu thirrës ndahet në pjesët përbërëse të tij. Si rezultat, kthehet një grup që përmban nënvargjet e marra nga vargu thirrës. Karakteret që kufizojnë këto nënvargje kalohen në grupin ndarës. Nëse grupi ndarës është bosh ose i referohet një vargu bosh, atëherë një hapësirë përdoret si ndarës i nënvargut. Dhe në formën e dytë të kësaj metode, kthehet numri i nënvargjeve të specifikuara nga parametri count.
|
Ndarja e vargut publik (ndarësi i shenjave, opsionet e StringSplitOptions) Ndarja e vargut publik (ndarësi i vargut, opsionet e StringSplitOptions) Ndarja e vargut publik (ndarësi i shenjave, numërimi int, opsionet e StringSplitOptions) Ndarja e vargut publik (ndarësi i vargjeve, numërimi int, opsionet e StringSplitOptions) |
Në dy format e para të metodës Split (), vargu thirrës ndahet në pjesë dhe kthehet një varg që përmban nënvargjet e marra nga vargu thirrës. Karakteret që ndajnë këto nënvargje kalohen në grupin ndarës. Nëse grupi ndarës është bosh, atëherë një hapësirë përdoret si ndarës. Dhe në formën e tretë dhe të katërt të kësaj metode, kthehet numri i rreshtave, i kufizuar nga parametri i numërimit.
Por në të gjitha format, parametri i opsioneve tregon një mënyrë specifike për të trajtuar linjat boshe që krijohen kur dy ndarës janë krah për krah. Vetëm dy vlera janë përcaktuar në numërimin e StringSplitOptions: Asnje dhe RemoveEmptyEntries... Nëse opsionet janë Asnjë, vargjet boshe përfshihen në rezultatin përfundimtar të ndarjes së vargut origjinal. Dhe nëse parametri i opsioneve është vendosur në RemoveEmptyEntries, atëherë vargjet boshe përjashtohen nga rezultati përfundimtar i ndarjes së vargut origjinal.
|
Bashkohu ()
|
bashkimi i vargut statik publik (ndarësi i vargut, vlera e vargut) Vargu statik publik Join (ndarësi i vargut, vlera e vargut, int startIndex, int count) |
Ndërton një varg të ri duke kombinuar përmbajtjen e një vargu vargjesh.
Forma e parë e metodës Join () kthen një varg të përbërë nga nënvargjet e bashkuara të kaluara në grupin e vlerave. Forma e dytë kthen gjithashtu një varg të përbërë nga nënvargjet e kaluara në grupin e vlerave, por ato janë të lidhura në një numër të caktuar numërimesh, duke filluar nga elementi i grupit të vlerave. Në të dy format, çdo rresht pasues ndahet nga rreshti i mëparshëm nga një ndarës i specifikuar nga parametri ndarës.
|
Linjat e mbushjes dhe zvogëlimit
|
Prerje ()
|
Prerja e vargut publik () Prerja e vargut publik (params char trimChars) |
Një metodë që ju lejon të hiqni të gjitha dukuritë e një grupi specifik karakteresh nga fillimi dhe fundi i linjës aktuale.
Në formën e parë të metodës Trim (), hapësirat kryesore dhe pasuese hiqen nga vargu thirrës. Dhe forma e dytë e kësaj metode heq dukuritë kryesore dhe pasuese në vargun e karaktereve thirrëse nga grupi trimChars. Në të dyja format, vargu që rezulton kthehet.
|
PadLeft ()
|
varg publik PadLeft (int totalWidth) Vargu publik PadLeft (int totalWidth, char paddingChar) |
Ju lejon të mbushni vargun me karaktere në të majtë.
Forma e parë e metodës PadLeft () fut hapësira në anën e majtë të linjës thirrëse në mënyrë që gjatësia totale e saj të jetë e barabartë me vlerën e parametrit totalWidth. Dhe në formën e dytë të kësaj metode, karakteret e shënuara me parametrin paddingChar futen nga ana e majtë e linjës thirrëse në mënyrë që gjatësia totale e saj të jetë e barabartë me vlerën e parametrit totalWidth. Në të dyja format, vargu që rezulton kthehet. Nëse gjerësia totale është më e vogël se gjatësia e vargut thirrës, kthehet një kopje e vargut thirrës të pandryshuar.
|
PadRight ()
|
Njësoj si PadLeft () |
Ju lejon të mbushni vargun me karaktere në të djathtë.
|
Futni, fshini dhe zëvendësoni vargjet
|
Fut ()
|
Fut vargun publik (int startIndex, vlera e vargut)
|
Përdoret për të futur një rresht në një tjetër, ku vlera tregon rreshtin që duhet futur në rreshtin thirrës në indeksin startIndex. Metoda kthen vargun që rezulton.
|
Hiq ()
|
vargun publik Hiq (int startIndex) Hiq vargun publik (indeksi i fillimit int, numërimi int) |
Përdoret për të hequr një pjesë të një vargu. Në formën e parë të metodës Remove (), heqja kryhet duke filluar nga vendi i treguar nga startIndex dhe duke vazhduar deri në fund të rreshtit. Dhe në formën e dytë të kësaj metode, numri i karaktereve të specifikuara nga parametri i numërimit hiqet nga vargu, duke filluar nga pozicioni i treguar nga indeksi startIndex.
|
Zëvendësoni ()
|
vargu publik Zëvendëso (char oldChar, char newChar) Zëvendësimi i vargut publik (vargu i vjetërVlera, vargu i riVlera) |
Përdoret për të zëvendësuar një pjesë të një vargu. Në formën e parë të metodës Replace (), të gjitha shfaqjet e OldChar në vargun thirrës zëvendësohen me newChar. Dhe në formën e dytë të kësaj metode, të gjitha shfaqjet e vargut oldValue në vargun thirrës zëvendësohen me vargun newValue.
|
Ndryshimi i rastit
|
E sipërme ()
|
vargu publik Topper ()
|
Shkruan të gjitha shkronjat në vargun thirrës.
|
Tower ()
|
vargu publik ToLower ()
|
Të gjitha shkronjat e vogla në vargun thirrës.
|
Marrja e një nënvargu nga një varg
|
Nënstring ()
|
Nënstring i vargut publik (int startIndex) Nënstring i vargut publik (Int startIndex, int length) |
Në formën e parë të metodës Substring (), nënvargu merret nga pozicioni i treguar nga parametri startIndex deri në fund të vargut thirrës. Forma e dytë e kësaj metode nxjerr një nënvarg që përbëhet nga numri i karaktereve të specifikuara nga parametri i gjatësisë, duke filluar nga vendi i treguar nga parametri startIndex.
|
Shembulli i mëposhtëm i programit përdor disa nga metodat e mësipërme:
Përdorimi i Sistemit; duke përdorur System.Collections.Generic; duke përdorur System.Linq; duke përdorur System.Text; namespace ConsoleApplication1 (programi i klasës (programi statik i zbrazët (kryesore e vargut) (// Krahasoni dy rreshtat e parë string s1 = "ky është një varg"; vargu s2 = "ky është tekst dhe ky është një varg"; nëse (String. CompareOrdinal (s1, s2) ! = 0) Console.WriteLine ("Strings s1 dhe s2 nuk janë të barabarta"); nëse (String.Compare (s1, 0, s2, 13, 10, true) == 0) Console.WriteLine ("Për më tepër, ata kanë të njëjtin tekst "); // Lidhja e vargjeve Console.WriteLine (String.Concat (" \ n "+" Një, dy "," tre, katër ")); // Kërko në një varg // Shfaqja e parë e një nënvargu if (s2. IndexOf ("this")! = -1) Console.WriteLine ("Fjala \" this \ "u gjet në rresht, është" + "në: (0) pozicion" , s2.IndexOf ("this")); / / Ndodhja e fundit e nënvargut if (s2.LastIndexOf ("this")! = -1) Console.WriteLine ("Ndodhja e fundit e fjalës \" kjo \ "është " + "në (0) pozicion", s2.LastIndexOf ("this" )); // Kërko nga një grup karakteresh char myCh = ("Y", "x", "t"); nëse (s2.IndexOfAny (myCh)! = -1) Console.WriteLine ("Një nga karakteret nga grupi ch "+" i gjetur në aktual rreshti në pozicionin (0) ", s2.IndexOfAny (myCh)); // Përcaktoni nëse vargu fillon me një nënvarg të caktuar if (s2.StartsWith ("ky është tekst") == true) Console.WriteLine ("Substring u gjet!"); // Përcaktoni nëse vargu përmban një nënvarg // duke përdorur shembullin e përcaktimit të vargut të OS të përdoruesit myOS = Environment.OSVersion.ToString (); if (myOS.Contains ("NT 5.1")) Console.WriteLine ("Sistemi juaj operativ është Windows XP"); else if (myOS.Contains ("NT 6.1")) Console.WriteLine ("Sistemi juaj operativ Windows 7"); Console.ReadLine (); )))
Pak për krahasimin e vargjeve në C #
Nga të gjitha operacionet e përpunimit të vargut të karaktereve, ka të ngjarë që një varg të krahasohet me një tjetër. Para se të shqyrtojmë ndonjë metodë për krahasimin e vargjeve, duhet theksuar sa vijon: krahasimet e vargjeve mund të kryhen në .NET Framework në dy mënyra kryesore:
Së pari, krahasimi mund të pasqyrojë zakonet dhe normat e një mjedisi të caktuar kulturor, të cilat shpesh janë mjedise kulturore që hyjnë në fuqi kur programi ekzekutohet. Kjo është sjellje standarde për disa, por jo të gjitha, metodat e krahasimit.
Dhe së dyti, krahasimi mund të bëhet pavarësisht nga cilësimet e mjedisit kulturor vetëm nga vlerat rendore të personazheve që përbëjnë vargun. Në përgjithësi, krahasimet e vargjeve të neglizhuara kulturalisht përdorin rend leksikografik (dhe konsiderata gjuhësore) për të përcaktuar nëse një varg është më i madh, më i vogël ose i barabartë me një varg tjetër. Në një krahasim rendor, vargjet thjesht renditen bazuar në vlerën e pandryshuar të çdo karakteri.
Për shkak të metodave të ndryshme të krahasimit kulturor dhe rendor për krahasimet e vargjeve dhe implikimeve të secilit krahasim të tillë, rekomandohet fuqimisht që të ndiqni praktikat më të mira të ofruara aktualisht nga Microsoft. Në fund të fundit, zgjedhja e mënyrës së gabuar për të krahasuar vargjet mund të çojë në funksionim të gabuar të programit kur përdoret në një mjedis që ndryshon nga ai në të cilin është zhvilluar.
Zgjedhja se si të krahasohen vargjet e karaktereve është një vendim shumë i rëndësishëm. Si rregull i përgjithshëm dhe pa përjashtim, krahasimi i vargjeve kulturalisht i përshtatshëm duhet të zgjidhet nëse është për qëllimin e shfaqjes së rezultatit te përdoruesi (për shembull, për të shfaqur një seri vargjesh të renditura sipas rendit leksikografik). Megjithatë, nëse vargjet përmbajnë informacion fiks që nuk është menduar të modifikohet për të përshtatur dallimet kulturore, të tilla si një emër skedari, fjalë kyçe, adresë uebsajti ose vlerë sigurie, atëherë duhet të zgjidhni një krahasim rendor të vargut. Sigurisht, specifikat e një aplikacioni të caktuar që po zhvillohet do të diktojnë zgjedhjen e një mënyre të përshtatshme për të krahasuar vargjet e karaktereve.
Klasa String ofron një shumëllojshmëri metodash të krahasimit të vargjeve, të cilat janë renditur në tabelën e mësipërme. Më e gjithanshme prej tyre është metoda Krahaso (). Ju lejon të krahasoni dy vargje tërësisht ose pjesërisht, të ndjeshme ndaj shkronjave të vogla ose të pandjeshme, mënyra e krahasimit të përcaktuar nga parametri i tipit Krahasimi i vargjeve si dhe informacioni i kulturës i dhënë me një parametër tipi CultureInfo.
Mbingarkesat e Compare () që nuk përmbajnë një parametër të tipit StringComparison kryejnë një krahasim të ndjeshëm ndaj shkronjave dhe kulturës të vargjeve të karaktereve. Dhe në ato variante të mbingarkuar që nuk përmbajnë një parametër të llojit CultureInfo, informacioni i kulturës përcaktohet nga koha aktuale e ekzekutimit.
Lloji StringComparison është një numërim që përcakton vlerat e paraqitura në tabelën më poshtë. Duke përdorur këto vlera, ju mund të organizoni krahasime të vargjeve për t'iu përshtatur nevojave të aplikacionit tuaj të veçantë. Prandaj, shtimi i një parametri të tipit StringComparison zgjeron metodën Compare () dhe metoda të tjera krahasimi si Equals (). Gjithashtu bën të mundur që të tregohet pa mëdyshje se si supozohet të krahasohen vargjet.
Për shkak të dallimeve midis krahasimeve të vargjeve të ndjeshme ndaj kulturës dhe krahasimeve rendore, është shumë e rëndësishme të jemi sa më të saktë në këtë drejtim.
Vlerat e përcaktuara në numërimin e StringComparison Kuptimi |
Përshkrim |
---|
Kultura aktuale
|
Krahasimet e vargjeve bëhen duke përdorur cilësimet aktuale të kulturës |
CurrentCultureIgnoreCase
|
Krahasimet e vargjeve bëhen duke përdorur cilësimet aktuale të kulturës, por jo të ndjeshme ndaj shkronjave të vogla |
Kulturë e pandryshueshme
|
Krahasimi i vargjeve bëhet duke përdorur të pandryshueshme, d.m.th. të dhëna universale për mjedisin kulturor |
InvariantCultureIgnoreCase
|
Krahasimi i vargjeve bëhet duke përdorur të pandryshueshme, d.m.th. të dhëna universale për mjedisin kulturor dhe të pandjeshme ndaj rasteve |
rendore
|
Krahasimet e vargjeve bëhen duke përdorur vlerat rendore të karaktereve në varg. Në këtë rast mund të cenohet rendi leksikografik dhe të shpërfillen konventat e miratuara në një mjedis të veçantë kulturor. |
OrdinalIgnoreCase
|
Krahasimi i vargjeve kryhet duke përdorur vlerat rendore të karaktereve në varg, por jo sensitive |
Në secilin rast, metoda Compare () kthen një vlerë negative nëse vargu i parë që krahasohet është më i vogël se i dyti; vlerë pozitive nëse vargu i parë i krahasuar është më i madh se i dyti; dhe në fund zero nëse të dy vargjet që krahasohen janë të barabartë. Megjithëse metoda Compare () kthen zero nëse vargjet që krahasohen janë të barabarta, në përgjithësi është më mirë të përdoret metoda Equals () ose operatori == për të përcaktuar nëse vargjet e karaktereve janë të barabarta.
Çështja është se metoda Compare () përcakton barazinë e vargjeve të krahasuara bazuar në renditjen e tyre. Për shembull, nëse po i krahasoni vargjet në një mënyrë të ndjeshme ndaj kulturës, atëherë të dy vargjet mund të jenë të njëjta sipas renditjes së tyre, por jo në thelb të barabartë. Si parazgjedhje, barazia e vargut përcaktohet në metodën Equals () bazuar në vlerat rendore të karaktereve dhe është kulturalisht e pandjeshme. Prandaj, si parazgjedhje, të dy vargjet krahasohen në këtë metodë për barazi absolute, karakter pas karakteri, ashtu si në operatorin ==.
Megjithëse metoda Compare () është më e gjithanshme, është më e lehtë të përdoret metoda CompareOrdinal () për krahasime të thjeshta rendore të vargjeve të karaktereve. Së fundi, mbani në mend se metoda CompareTo () krahason vetëm vargjet e kulturës.
Programi i mëposhtëm demonstron përdorimin e metodave Compare (), Equals (), CompareOrdinal () dhe operatorëve == dhe! = për të krahasuar vargjet e karaktereve. Vini re se dy shembujt e parë të krahasimit ilustrojnë ndryshimin midis krahasimeve të vargjeve me ndjeshmëri kulturore dhe krahasimeve rendore në anglisht:
Përdorimi i Sistemit; Klasa Shembull (zbrazëti statike kryesore () (string str1 = "alfa"; vargu str2 = "Alfa"; vargu str3 = "Beta"; vargu str4 = "alfa"; vargu str5 = "alfa, beta"; rezultati int; / / Së pari, demonstroni ndryshimin midis krahasimit të vargjeve të ndjeshme ndaj kulturës dhe rezultatit të krahasimit rendor = String.Compare (str1, str2, StringComparison.CurrentCulture); Console.Write ("Krahasimi i vargjeve të ndjeshme ndaj kulturës:"); nëse (rezultati 0 ) Konsola .WriteLine (str1 + "më e madhe se" + str2); tjetër Console.WriteLine (str1 + "e barabartë me" + str2); rezultat = String.Compare (str1, str2, StringComparison.Ordinal); Console.Write ("Krahasimi rendor rreshtat: "); nëse (rezultati 0) Console.WriteLine (str1 +" më i madh se "+ str2); tjetër Console.WriteLine (str1 +" i barabartë me "+ str4); // Përdorni metodën CompareOrdinal () rezultat = String .CompareOrdinal ( str1, str2); Console.Write ("Krahaso vargjet duke përdorur metodën CompareOrdinal (): \ n"); nëse (rezultati 0) Console.WriteLine (str1 + "më shumë" + str2); tjetër Console.WriteLine ( rr 1 + "e barabartë" + str4); Console.WriteLine (); // Përcaktoni barazinë e vargjeve duke përdorur operatorin == // Ky është një krahasim rendor i vargjeve të karaktereve nëse (str1 == str4) Console.WriteLine (str1 + "==" + str4); // Përcaktoni pabarazinë e vargut duke përdorur operatorin = If (str1! = Str3) Console.WriteLine (str1 + "! =" + Str3); if (str1! = str2) Console.WriteLine (str1 + "! =" + str2); Console.WriteLine (); // Kryeni një krahasim rendor të vargjeve pa ndjeshmëri ndaj shkronjave // duke përdorur metodën Equals () if (String.Equals (str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine ("Krahasimi i vargjeve duke përdorur metodën Equals () me" + "Parametri OrdinalIgnoreCase: \ n "+ str1 +" është i barabartë me "+ str2); Console.WriteLine (); // Krahasoni pjesët e vargjeve nëse (String.Compare (str2, 0, str5, 0, 3, StringComparison.CurrentCulture)> 0) (Console.WriteLine ("Krahaso vargjet bazuar në kulturën aktuale:" + "\ n3 karakteret e para i rreshtit "+ str2 +" është më i madh se 3 karakteret e para të vargut "+ str5);)))
Ekzekutimi i këtij programi prodhon rezultatin e mëposhtëm:
Artikujt kryesorë të lidhur