Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Lloji i të dhënave të vargut në C. vargjet C

Deklarimi i vargjeve

Një varg C është një grup njëdimensional i karaktereve, elementi i fundit i të cilit është një varg me fund të pavlefshëm (string me përfundim null).

Deklarimi i një variabli të tipit string në gjuhën C është i mundur në tre mënyra, dy prej të cilave inicializojnë vargun gjatë deklarimit.

Mënyra e parë:

Deklaratat e grupit të karaktereve (mos harroni të shtoni hapësirë ​​për null pasues):

Char s;

Mënyra e dytë:

Cakto një vlerë fillestare për një variabël vargu (në këtë rast, përpiluesi mund të llogarisë vetë gjatësinë e vargut):

Char s = "Shembull i inicializimit të vargut";

Një konstante vargu shkruhet në të djathtë të shenjës së caktimit. Një zero ('\ 0') shtohet automatikisht në fund të rreshtit. Konstantet e vargut të karaktereve vendosen në një klasë memorie statike.

Mënyra e tretë:

Një tregues i nënkuptuar se një grup është duke u përdorur. Në të majtë të shenjës së caktimit është një tregues për një simbol:

Char * s = "Opsioni i dytë i inicializimit";

Ndryshorja s do të jetë një tregues për vendndodhjen në RAM ku ndodhet konstanta e vargut. Ekziston një gabim i mundshëm në këtë formë shënimi, që është se një tregues për një karakter shpesh quhet varg. Hyrja më poshtë është vetëm një tregues për një karakter, pasi nuk ka hapësirë ​​për vendosjen e vargut:

Char * s;

Futja e një vargu nga një pajisje standarde hyrëse (tastierë)

Ekziston një grup funksionesh për të punuar me vargje. Për hyrje nga një pajisje hyrëse standarde (tastierë), funksionet e bibliotekës nga moduli standard hyrje-dalje përdoren më shpesh: scanf dhe merr.

Për të futur një varg duke përdorur një funksion scanf, përdor formatin « % s» , dhe vini re se asnjë shenjë adrese nuk përdoret përpara identifikuesit të vargut « & » , meqenëse grupi njëdimensional tashmë përfaqësohet nga një tregues në fillimin e tij:

Scanf ("% s", s);

Funksioni merr () lexon karaktere derisa të arrijë një karakter të linjës së re. Funksioni pranon të gjithë karakteret deri në karakterin e furnizimit të linjës, por nuk e përfshin atë. Një zero pasuese ('\ 0') është bashkangjitur në fund të rreshtit. Funksioni merr () vendos sekuencën e karaktereve të lexuara nga tastiera në një parametër të tipit string dhe kthen një tregues në këtë varg (nëse operacioni ishte i suksesshëm), ose NULL (në rast gabimi). Në shembullin e mëposhtëm, pas përfundimit të suksesshëm të operacionit, dy rreshta identike do të shfaqen në ekran:

#përfshi int main () (char s; char * p; p = merr (s); printf ("\ n vargu% s u fut.", s); nëse (p) printf ("\ n vargu% s u fut.", p); kthe 0;)

Në kalim, vërejmë se funksioni merr shpesh përdoret për të futur çdo të dhënë nga tastiera si një varg me qëllim të konvertimit të mëtejshëm të funksionit sscanf në formatin e dëshiruar ose për analizën paraprake të të dhënave hyrëse, për shembull:

#përfshi #përfshi #përfshi int main () (char s; int x, err; do (printf ("\ n Fut një numër të plotë ->"); merr (s); err = sscanf (s, "% d", & x); nëse ( err ! = 1) printf ("\ n Gabim në hyrje.");) Ndërsa (gabim! = 1); printf ("\ n Numri i plotë i futur ->% d", x); kthe 0;)

Dalja e linjave në dalje standarde (ekrani i monitorit)

Dy funksione mund të përdoren për të nxjerrë vargjet në dalje standarde (ekrani i monitorit) printf dhe ... Në funksionin printf, "% s" kalohet si format. Lehtësia e përdorimit të këtij funksioni qëndron në faktin se përveç një vargu, mund të nxirrni menjëherë të dhëna të llojeve të tjera. Veçori e veçorisë qëndron në faktin se pas daljes së linjës, kalimi në rreshtin tjetër ndodh automatikisht.

Funksionet për të punuar me vargje

Biblioteka e vargjeve ofrohet për konvertimin e vargjeve në gjuhën C. Secili prej funksioneve ka formatin e vet të regjistrimit (prototip).

Funksionet më të përdorura janë trajtuar në këtë artikull. - lexo

Një shembull i programeve (listimit) që punojnë me vargje

Programuesi thotë:

Përshëndetje! E lexova artikullin tuaj. Isha shumë e trishtuar dhe qesharake në të njëjtën kohë. Kjo frazë e juaja është veçanërisht vrasëse: "Meqenëse një variabël i tipit char përdoret shpesh si grup, përcaktohet numri i vlerave të mundshme". 😆 😆 😆
Nuk po qesh me ty. Ndërtimi i një faqe interneti është me të vërtetë një sukses. Unë thjesht dua t'ju mbështes me këshilla dhe të tregoj disa gabime.

1. Vlera e një ndryshoreje të tipit char caktohet si më poshtë:

Këtu:

Char a = * "A";

Treguesi i grupit është i paadresuar dhe, si rezultat, kthehet vlera e elementit të parë të grupit, d.m.th. 'A'

2. Zeroizimi bëhet si më poshtë:

Char a = NULL;
char b = ();

// Dhe kështu pastrohet linja në trupin e programit

"" - ky karakter quhet një terminator null. Vendoset në fund të rreshtit. Ju vetë, pa e ditur, mbushët grupin s1 nga artikulli juaj me këtë simbol. Por ishte e mundur të caktohej ky simbol vetëm në elementin zero të grupit.

3. Mos ngurroni të përdorni terminologjinë.
Shenja = është një operacion caktimi.
Shenja * është një operacion thirrës.
E kam fjalën për këtë fragment të artikullit: "Gjithçka doli të ishte kaq e thjeshtë, përpara shenjës = duhej të vendosje një shenjë * dhe duhet të deklaroje numrin e elementit (zero korrespondon me të parën)"

Mos më keqkuptoni, artikulli si qëndron nuk mund të ekzistojë. Mos u bëni dembel, rishkruajeni atë.
Ju keni një përgjegjësi të madhe! E kam seriozisht. Faqet e faqes suaj u përfshinë në faqen e parë të rezultateve të kërkimit Yandex. Shumë njerëz tashmë kanë filluar të përsërisin gabimet pas jush.

Paç fat! Ju mund ta përballoni atë!

:
Unë e di këtë për një kohë të gjatë, thjesht është e vështirë të rilexosh 200 artikuj gjatë gjithë kohës për të rregulluar diçka. Dhe disa tipa të vrazhdë shkruajnë në atë mënyrë që edhe duke ditur se çfarë është më mirë të rregullohet, nuk ka fare dëshirë për ta rregulluar.

Do të jem i lumtur të rregulloj edhe gabime të tjera. korrigjoni pasaktësitë nëse shfaqen. E vleresoj ndihmen tuaj. Faleminderit. Unë e di këtë për një kohë të gjatë, thjesht është e vështirë të rilexosh 200 artikuj gjatë gjithë kohës për të rregulluar diçka. Dhe disa tipa të vrazhdë shkruajnë në atë mënyrë që edhe duke ditur se çfarë është më mirë të rregullohet, nuk ka fare dëshirë për ta rregulluar.
Me karakterin tuaj b = (); Kjo nuk është fare zero. do të kishte kontrolluar të paktën b.
nëse flasim për karakterin null ""; E dija shumë mirë kur e plotësoja rreshtin me ta dhe qëllimi ishte të tregoja një pastrim të vërtetë, dhe jo të dukshëm për syrin, sepse linja përfshin mbeturina, të cilat ndonjëherë i pengojnë. Ju do të jeni më të kujdesshëm me termat vetë, "karakter i pavlefshëm" ose thjesht "karakter i pavlefshëm", jo një terminator))) Dhe karakteri terminator tingëllon thjesht i lezetshëm.

Po e modernizoj artikullin, por nuk do të kaloj në stilin e dikujt tjetër. Nëse mendoj se për një fillestar është më e qartë kështu, dhe jo ashtu siç dëshiron, atëherë do ta lë kështu. Edhe ju mos me keqkuptoni. Fjala "shenjë" është shumë më e lehtë për një fillestar të dobët për të kuptuar dhe mbajtur mend sesa përkufizimi dhe emri i secilës shenjë. Nuk ka absolutisht asnjë gabim në këtë, shenja është - shenja. Më pak theks në një gjë jep më shumë theks në tjetrin.

Do të jem i lumtur të rregulloj edhe gabime të tjera. korrigjoni pasaktësitë nëse shfaqen. E vleresoj ndihmen tuaj. Faleminderit.

Pershendetje perseri!
Dua të sqaroj. Termi "zero-terminator" (terminator) është përdorur nga mësuesi im në universitet. Me sa duket kjo është shkolla e vjetër!
Sa i përket linjave anuluese.
char b = (); Kjo është me të vërtetë zero. I gjithë grupi është i mbushur me zero. Mos e besoni - shikoni!
Nëse marrim parasysh një varg në kuptimin e tij natyror, të përditshëm, atëherë "bosh" do të jetë vargu në të cilin nuk ka asnjë karakter të vetëm. Prandaj, në 99.9% të rasteve, mjafton të parashtrohet një karakter null. Zakonisht, përpunimi i një vargu shkon deri në karakterin e parë null, dhe cilat karaktere e ndjekin atë nuk është më e rëndësishme. E kuptoj që ke dashur të zero vargun. Sapo vendosa të ofroj një version klasik të testuar me kohë.

:
Kur "Zakonisht përpunimi i vargut shkon deri në karakterin e parë të pavlefshëm dhe karakteret që ndjekin nuk është më i rëndësishëm" - po, vargu rivendoset në zero
Nëse marrim parasysh "zeroizimin real të të gjitha qelizave në varg (për të cilin kam shkruar)" - jo, jo zero, dhe madje edhe karakteri i parë nuk është zero. E kontrollova këtë opsion. MinGW (CodeBlock) - i gjithë grupi jep karakterin "a"
Nuk mendoj se kjo është një arsye për polemika.

Në këtë tutorial do të diskutojmë vargjet e stilit C, mund t'i keni parë tashmë këto rreshta në faqen tonë të internetit ose në ndonjë udhëzues tjetër. Në fakt, vargjet C janë vetëm vargje karakteresh, por me specifikat e tyre, kështu që ne gjithmonë e dimë se ku është fundi i vargut. Në këtë artikull do të shikojmë disa funksione për të punuar me vargje, për shembull, ju - kopjoni, bashkoni, merrni gjatësinë e një vargu.

Çfarë janë vargjet?

Vini re se së bashku me vargjet e stilit C, të cilat në thelb janë vargje të thjeshta, ekzistojnë edhe literale të vargjeve si ky "literal". Në realitet, të dy vargjet dhe literalet janë thjesht grupe karakteresh të vendosura krah për krah në kujtesën e kompjuterit. Por ka ende një ndryshim midis vargjeve dhe literaleve, fjalë për fjalë nuk mund të ndryshohen dhe vargjet - mundeni.

Çdo funksion që pranon një varg të stilit C mund të marrë gjithashtu një fjalë për fjalë si parametër. Ekzistojnë gjithashtu disa entitete në B që mund të duken si vargje, ndërsa në fakt nuk janë. Unë po flas për personazhet tani, ata janë të mbyllur në thonjëza teke, ja një shembull - "a", siç mund ta shihni, ky nuk është një varg. Një karakter mund t'i caktohet një vargu në një vendndodhje specifike, por karakteret nuk mund të përpunohen si një varg. Nëse ju kujtohet, vargjet funksionojnë si tregues, kështu që nëse kaloni një karakter për varg, ai do të konsiderohet një gabim.

Nga të gjitha sa më sipër, duhet të kuptoni se vargjet janë vargje karakteresh dhe vargjet literale janë fjalë të rrethuara me thonjëza të dyfishta. Këtu është një shembull tjetër i një literal:

"Ky është një varg statik"

A keni harruar për specifikat e vargjeve që u përmendën pak më lart? Pra, vargjet C duhet gjithmonë të përfundojnë me një karakter null, fjalë për fjalë "\ 0". Prandaj, për të deklaruar një varg të përbërë nga 49 shkronja, duhet të rezervoni një qelizë shtesë për një karakter null:

Char myString;

Siç mund ta shihni nga shembulli, gjatësia e grupit është 50 karaktere, 49 prej të cilave do të marrin një varg dhe një, e fundit do të marrë një karakter null. Është e rëndësishme të mbani mend se duhet të ketë gjithmonë një karakter null në fund të vargjeve C, ashtu si ka një pikë në fund të çdo fjalie. Megjithëse karakteri null nuk shfaqet në daljen e linjës, ai përsëri zë hapësirën e memories. Pra, teknikisht, ju mund të ruani vetëm 49 shkronja në një grup prej pesëdhjetë elementësh, sepse karakteri i fundit është i nevojshëm për të përfunduar vargun. Përveç kësaj, treguesit mund të përdoren gjithashtu si vargje. Nëse e lexoni artikullin, mund të bëni diçka si kjo:

Char * myString; // tregues i tipit char myString = malloc (madhësia e (* myString) * 64); // alokimi i memories

Në këtë shembull, ne kemi ndarë 64 vendndodhje memorie për grupin myString. Përdorni funksionin e lirë () për të liruar kujtesën.

Falas (myString);

Përdorimi i vargjeve

Vargjet janë të dobishme kur ju duhet të kryeni operacione të ndryshme me informacionin e tekstit. Për shembull, nëse dëshironi që përdoruesi të fusë një emër në program, duhet të përdorni një varg. Përdorimi i scanf () për të futur një varg funksionon, por mund të shkaktojë një tejmbushje buferi. Në fund të fundit, vargu i hyrjes mund të jetë më i madh se madhësia e vargut buffer. Ka disa mënyra për të zgjidhur këtë problem, por mënyra më e lehtë është të përdoret, e cila është deklaruar në skedarin e kokës. .

Kur lexon hyrjen nga përdoruesi, do të lexojë të gjithë, përveç karakterit të fundit. Pas kësaj, në fund të rreshtit të leximit, ai do të vendosë një terminator null. Funksioni fgets () do të lexojë karaktere derisa përdoruesi të godasë Enter. Le të shohim një shembull duke përdorur fgets ():

#përfshi int main () (char myString; // varg i gjatë printf ("Fut një varg të gjatë:"); fgets (myString, 100, stdin); // lexoni një varg nga rrjedha hyrëse printf ("Keni futur vargun e mëposhtëm: % s", myString); getchar ();)

Parametri i parë për fgets () është një varg, parametri i dytë është madhësia e vargut dhe parametri i tretë është një tregues në rrjedhën e të dhënave hyrëse.

Rezultati i programit:

<ВВОД>...

Siç mund ta shihni, nga dalja e programit, një karakter i linjës së re "\ n" hyri në linjën hyrëse. Kjo ndodhi për faktin se fgets () lexoi shtypjen e butonit Enter në vargun myString dhe doli. Kjo do të thotë që mund t'ju duhet të hiqni manualisht karakterin e linjës së re. Një mënyrë për ta bërë këtë është me përsëritjen e karaktereve. Le të modifikojmë programin dhe të heqim karakterin e linjës së re:

#përfshi int main () (char myString; // varg i gjatë printf ("Fut një varg të gjatë:"); fgets (myString, 100, stdin); // lexoni një varg nga rrjedha hyrëse int i; për (i = 0; i< 100; i++) { if (myString[i] == "\n") { myString[i] = "\0"; break; } } printf("Вы ввели следующую строку: %s", myString); getchar(); }

Ju lutemi vini re se nëse vargu i hyrjes përmban më pak se 100 karaktere, atëherë karakteri i linjës së re do të përfshihet gjithashtu në varg. Prandaj, ne mund ta heqim këtë karakter duke përdorur përsëritje të thjeshtë. Ne shtuam një lak në program në të cilin përsërisim karakteret e vargut, rreshtat 12-19... Dhe kur hasim një karakter të linjës së re, ne e zëvendësojmë atë me një karakter null, rreshti 16... Rezultati i programit:

Futni rreshtin e gjatë: Fati lë shenjën e tij Keni futur rreshtin vijues: Fati lë shenjën e tij Shtypni për të mbyllur këtë dritare<ВВОД>...

Kjo është e gjitha për tani. Në artikullin tjetër do t'ju tregoj për funksione të veçanta për të punuar me vargje.

PS: Të gjithëve na pëlqen të shikojmë regjistrime të ndryshme video, por ndonjëherë ndodh që nuk është gjithmonë e mundur të luhen disa formate skedarësh video. Pra, mund ta zgjidhni këtë problem duke përdorur programin - xilisoft converter ultimate. Mund ta konvertoni me lehtësi videon nga një format në tjetrin. Përveç kësaj, ky program gjithashtu mund të konvertojë skedarë audio dhe imazhe të animuara.

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)

Krahasoni int statike publike (strA, int indexA, varg strB, int indexB, gjatësia int, Lloji i krahasimit të vargut)

Krahasoni int statike publike (strA strA, int indexA, string strB, int indexB, int length, bool ignoreCase, CultureInfo Culture)

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 publik 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)

IndexOf publik (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. Dhe 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 ("Në të njëjtën kohë, ata kanë të njëjtin tekst "); // Lidhja e vargjeve Console.WriteLine (String.Concat (" \ n "+" Një, dy "," tre, katër ")); // Kërko në një string // Shfaqja e parë e një nënvargu if (s2. IndexOf ("this")! = -1) Console.WriteLine ("Fjala \" this \ "u gjet në rresht, është" + "at: (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ë krahasimeve të ndryshme kulturore dhe rendore të vargjeve dhe implikimeve të secilit krahasim, 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 emri i skedarit, fjalë kyçe, adresa e faqes në internet ose vlera e sigurisë, 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ë vetëdijshëm për kulturën dhe rezultatit të krahasimit rendor = String.Compare (str1, str2, StringComparison.CurrentCulture); Console.Write ("Krahasimi i vargjeve të vetëdijshëm për kulturën:"); 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:

Ju lutemi pezulloni AdBlock në këtë sajt.

Pra, vargjet në C. Nuk ka asnjë lloj të veçantë të dhënash për to, siç bëhet në shumë gjuhë të tjera programimi. Në C, një varg është një grup karakteresh. Për të shënuar fundin e një rreshti, përdoret karakteri "\ 0", për të cilin folëm në pjesën e fundit të këtij mësimi. Nuk shfaqet në asnjë mënyrë në ekran, kështu që nuk do të mund ta shikoni.

Krijimi dhe inicializimi i vargut

Meqenëse një varg është një grup karakteresh, deklarimi dhe inicializimi i një vargu është i njëjtë si për vargjet njëdimensionale.

Kodi i mëposhtëm ilustron mënyra të ndryshme për të inicializuar vargjet.

Listimi 1.

Char rr; char str1 = ("Y", "o", "n", "g", "C", "o", "d", "e", "r", "\ 0"); char str2 = "Përshëndetje!"; char str3 = "Përshëndetje!";

Fig. 1 Deklarimi dhe inicializimi i vargjeve

Në rreshtin e parë, ne thjesht deklarojmë një grup me dhjetë karaktere. Nuk është as një varg, pasi ai nuk ka karakterin null \ 0 përderisa është vetëm një grup karakteresh.

Rreshti i dytë. Mënyra më e thjeshtë për të inicializuar në ballë. Ne deklarojmë secilin personazh veç e veç. Gjëja kryesore këtu është të mos harroni të shtoni karakterin null \ 0.

Rreshti i tretë është analog me rreshtin e dytë. Kushtojini vëmendje figurës. Sepse ka më pak karaktere në vargun në të djathtë sesa elementët në grup, pjesa tjetër e elementeve do të mbushet me \ 0.

Rreshti i katërt. Siç mund ta shihni, nuk ka asnjë madhësi të specifikuar këtu. Programi do ta llogarisë atë automatikisht dhe do të krijojë një grup karakteresh të gjatësisë së kërkuar. Kjo do të futë karakterin null \ 0 të fundit.

Si të nxirret një varg

Le të shtojmë kodin e mësipërm në një program të plotë që do të shfaqë linjat e krijuara në ekran.

Listimi 2.

#përfshi int main (void) (char str; char str1 = ("Y", "o", "n", "g", "C", "o", "d", "e", "r", " \ 0 "); char str2 =" Përshëndetje! "; Char str3 =" Përshëndetje! "; Për (int i = 0; i< 10; i = i + 1) printf("%c\t",str[i]); printf("\n"); puts(str1); printf("%s\n",str2); puts(str3); return 0; }


Fig. 2 Mënyra të ndryshme për të shfaqur një varg në ekran

Siç mund ta shihni, ka disa mënyra themelore për të shfaqur një varg në ekran.

  • përdorni funksionin printf me specifikuesin% s
  • përdorimi vë funksion
  • përdorni funksionin fputs, duke specifikuar stdout si parametër të dytë.

Paralajmërimi i vetëm me funksionet put dhe fputs. Vini re se funksioni puts e mbyll daljen në rreshtin tjetër, por funksioni fputs jo.

Siç mund ta shihni, përfundimi është mjaft i thjeshtë.

Vargjet hyrëse

Futja e vargjeve është pak më e komplikuar sesa nxjerrja në dalje. Mënyra më e thjeshtë do të ishte si më poshtë:

Listimi 3.

#përfshi int main (void) (char str; merr (str); vendos (str); return 0;)

Funksioni gets ndalon programin, lexon një varg karakteresh të futura nga tastiera dhe e vendos atë në një grup karakteresh, emri i të cilit i kalohet funksionit si parametër.
Përfundimi i funksionit gets do të jetë karakteri që korrespondon me tastin enter dhe i shkruar në varg si karakter null.
E keni vënë re rrezikun? Nëse jo, përpiluesi do t'ju paralajmërojë me mirësi për këtë. Çështja është se funksioni gets del vetëm kur përdoruesi shtyp tastin enter. Kjo është e mbushur me faktin se ne mund të shkojmë përtej grupit, në rastin tonë - nëse futen më shumë se 20 karaktere.
Nga rruga, gabimet e tejmbushjes së tamponit konsideroheshin më parë si lloji më i zakonshëm i cenueshmërisë. Ato gjenden ende sot, por është bërë shumë më e vështirë përdorimi i tyre për të hakuar programe.

Pra, çfarë kemi. Ne kemi një detyrë: të shkruajmë një varg në një grup me madhësi të kufizuar. Kjo do të thotë, ne duhet të kontrollojmë disi numrin e karaktereve të futura nga përdoruesi. Këtu na vjen në ndihmë funksioni fgets:

Listimi 4.

#përfshi int main (void) (char str; fgets (str, 10, stdin); puts (str); return 0;)

Funksioni fgets merr tre argumente si hyrje: një variabël për të shkruar vargun, madhësinë e vargut për të shkruar dhe emrin e rrjedhës nga ku mund të merrni të dhënat për të shkruar në varg, në këtë rast, stdin. Siç e dini tashmë nga Mësimi 3, stdin është hyrje standarde, zakonisht e lidhur me një tastierë. Nuk është aspak e nevojshme që të dhënat të vijnë nga stdin stream; në të ardhmen, ne do ta përdorim këtë funksion edhe për të lexuar të dhënat nga skedarët.

Nëse gjatë ekzekutimit të këtij programi fusim një varg më të gjatë se 10 karaktere, vetëm 9 karaktere nga fillimi dhe gjithsesi në grup do të shkruhet një ndërprerje rreshti, fgets do ta "presë" vargun në gjatësinë e kërkuar.

Vini re se fgets nuk lexon 10 karaktere, por 9! Siç e kujtojmë, në vargje, karakteri i fundit është i rezervuar për një karakter null.

Le ta kontrollojmë. Le ta fillojmë programin nga lista e fundit. Dhe futni rreshtin 1234567890. Ekrani shfaq vargun 123456789.


Fig. 3 Një shembull se si funksionon funksioni fgets

Lind pyetja. Ku shkoi personazhi i dhjetë? Dhe unë do të përgjigjem. Nuk ka shkuar askund, ka mbetur në transmetimin e hyrjes. Drejtoni programin e mëposhtëm.

Listimi 5.

#përfshi int main (void) (char str; fgets (str, 10, stdin); puts (str); int h = 99; printf ("bëni% d \ n", h); scanf ("% d", & h ) ; printf ("posle% d \ n", h); kthimi 0;)

Këtu është rezultati i punës së saj.


Figura 4 Buffer jo bosh stdin

Më lejoni të shpjegoj se çfarë ndodhi. Ne e quajtëm funksionin fgets. Ajo hapi një rrymë hyrëse dhe priti që ne të futnim të dhënat. Ne futëm 1234567890 nga tastiera \ n (\ n dua të them duke shtypur tastin Enter). Kjo shkoi te transmetimi i hyrjes stdin. Funksioni fgets, siç pritej, mori 9 karakteret e para 123456789 nga rryma hyrëse, shtoi një karakter null \ 0 në to dhe e shkroi atë në vargun str. Kanë mbetur ende 0 \ n në transmetimin e hyrjes.

Më pas, ne deklarojmë variablin h. Ne e shfaqim vlerën e tij në ekran. Më pas e quajmë funksionin scanf. Këtu pritet që ne të mund të hyjmë diçka, por që 0 \ n varet në rrjedhën hyrëse, më pas funksioni scanf e percepton këtë si hyrjen tonë dhe 0 shkruhet në ndryshoren h. Më pas, ne e shfaqim atë në ekran.

Kjo, natyrisht, nuk është pikërisht sjellja që ne presim. Për të përballuar këtë problem, është e nevojshme të pastrohet buferi i hyrjes pasi të kemi lexuar një rresht të futur nga përdoruesi prej tij. Për këtë përdoret funksioni special flush. Ai ka vetëm një parametër - rrjedhën që duhet pastruar.

Le të rregullojmë shembullin e fundit në mënyrë që të funksionojë në mënyrë të parashikueshme.

Listimi 6.

#përfshi int main (void) (char str; fgets (str, 10, stdin); flush (stdin); // pastroj rrymën hyrëse vendos (str); int h = 99; printf ("do% d \ n", h ) ; scanf ("% d", & h); printf ("posle% d \ n", h); kthimi 0;)

Programi tani do të funksionojë siç pritej.


Fig. 4 Shpëlarja e buferit stdin me flush

Duke përmbledhur, mund të vihen re dy fakte. Së pari. Përdorimi i funksionit gets nuk është i sigurt për momentin, prandaj rekomandohet përdorimi i funksionit fgets kudo.

Së dyti. Mos harroni të shpëlani bufferin e hyrjes nëse jeni duke përdorur funksionin fgets.

Këtu përfundon biseda për futjen e vargjeve. Shkoni përpara.

Artikujt kryesorë të lidhur