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

Operacionet me vargje. Puna me vargje

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. 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ërdoret funksioni standard sprintf për këtë qëllim.

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ë i vogël, i barabartë me, ose më i madh 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.

Etiketa: vijat C. Vargu i shkronjave.

Vargjet në C. Prezantimi.

Ky është një artikull hyrës rresht pas rreshti në si. Një përshkrim dhe shembuj më i detajuar do të jetë kur të mësojmë të punojmë me kujtesën dhe treguesit. Në një kompjuter, të gjitha vlerat ruhen si numra. Dhe vargjet gjithashtu, nuk ka simbole apo shkronja. Termi është një grup numrash. Çdo numër korrespondon me një karakter specifik, i cili merret nga tabela e kodimit. Kur shfaqet në ekran, simboli shfaqet në një mënyrë të caktuar.
Vargjet e tipit char përdoren për të ruajtur vargjet. E përsëris edhe një herë - lloji char është numerik, ruan një bajt të dhënash. Por sipas tabelës së kodimit, secili prej këtyre numrave shoqërohet me një karakter. Dhe në drejtim të kundërt - çdo karakter përcaktohet nga numri i tij serial në tabelën e kodimit.
për shembull

#përfshi #përfshi void main () (char c = "A"; int i = 65; printf ("shfaq si char% c \ n", c); printf ("shfaq si int% d \ n", c); printf (" shfaq si char% c \ n ", i); printf (" shfaq si char% d \ n ", i); getch ();)

Kemi krijuar dy variabla, një të tipit karakter, një tjetër ndër... Shkronja "A" ka një vlerë numerike 65. Kjo është një fjalë për fjalë, jo një varg, prandaj është e rrethuar me thonjëza të vetme. Mund ta printojmë si letër

Printf ("shfaq si char% c \ n", c);

Pastaj do të dalë
A
Nëse e nxirrni si numër, do të jetë
65
Ju mund të bëni të njëjtën gjë me numrin 65, i cili ruhet në një variabël të llojit ndër.
Karakteret speciale gjithashtu kanë numrin e tyre

#përfshi #përfshi void main () (printf ("% c", "\ a"); printf ("% d", "\ a"); printf ("% c", 7); getch ();)

Këtu fillimisht do të "shfaqet" sinjali i zërit, pastaj vlera e tij numerike, pastaj përsëri sinjali i zërit.
Një varg në C është një grup i tipit karakter, elementi i fundit i të cilit ruan karakterin terminal "\ 0". Vlera numerike e këtij karakteri është 0, kështu që mund të themi se grupi është i përfunduar me null.
për shembull

#përfshi #përfshi kryesore e pavlefshme () (fjalë karakteristike; fjalë = "A"; fjalë = "B"; fjalë = "C"; fjalë = "\ 0"; // fjalë = 0; ekuivalente me printf ("% s", fjalë) ; marr ();)

Çelësi% s është përdorur për daljen. Kjo e printon vargun deri në karakterin e parë terminal, sepse funksioni printf nuk e njeh madhësinë e grupit të fjalëve.
Nëse në këtë shembull nuk vendosni

Fjala = "\ 0";

atëherë do të dalë një varg karakteresh me gjatësi arbitrare derisa të ndeshet bajt i parë i mbushur me zero.

#përfshi #përfshi kryesore e pavlefshme () (fjala char = "ABC"; teksti char = ("H", "E", "L", "L", "O"); printf ("% s \ n", fjala); printf ("% s", tekst); marrë ();)

Në këtë rast, gjithçka është e saktë. Vargu "ABC" përfundon me zero dhe ne inicializojmë grupin e fjalëve me të. Teksti i vargut inicializohet shkronjë për shkronjë, të gjithë karakteret e mbetura, siç vijon nga kapitulli i vargjeve, janë të mbushura me zero.

Leximi i rreshtave

Për të nxitur përdoruesin për një varg, duhet të krijohet një buffer. Madhësia e buferit duhet të zgjidhet paraprakisht, në mënyrë që fjala e futur të futet në të. Gjatë leximit të rreshtave, ekziston rreziku që përdoruesi të futë më shumë të dhëna sesa lejon buferi. Këto të dhëna do të lexohen dhe vendosen në memorie dhe do të mbishkruajnë vlerat e njerëzve të tjerë. Kështu, një sulm mund të kryhet duke shkruar bajtët e nevojshëm, në të cilët, për shembull, ia vlen të shkoni në një pjesë të kodit me një program me qëllim të keq, ose të regjistroni të dhëna.

#përfshi #përfshi void main () (buffer char; scanf ("% 19s", buffer); printf ("% s", buffer); getch ();)

Në këtë rast, numri i karaktereve të futura është i kufizuar në 19, dhe madhësia e tamponit është 1 më e madhe, pasi është e nevojshme të ruhet një karakter terminal. Le të shkruajmë një program të thjeshtë që i kërkon përdoruesit një varg dhe kthen gjatësinë e tij.

#përfshi #përfshi void main () (tampon char; lente e panënshkruar = 0; scanf ("% 127s", buffer); ndërsa (buffer! = "\ 0") (len ++;) printf ("gjatësia (% s) ==% d" , buffer, len); getch ();)

Meqenëse vlera numerike e karakterit "\ 0" është e barabartë me zero, mund të shkruani

Ndërsa (buffer! = 0) (len ++;)

Ose, edhe më e shkurtër

Ndërsa (buffer) (len ++;)

Tani le të shkruajmë një program që i kërkon përdoruesit dy fjalë dhe i krahason ato

#përfshi #përfshi / * Rezultati i krahasimit do të jetë numri 0 nëse fjalët janë 1 nëse fjala e parë është më e madhe se e dyta në rend leksikografik -1 nëse fjala e dytë është më e madhe se * / kryesore e pavlefshme () (char firstWord; // Fjala e parë char secondWord; // Fjala e dytë e panënshkruar i; / / Counter int cmpResult = 0; // Krahasimi i rezultatit scanf ("% 127s", FirstWord); scanf ("% 127s", secondWord); për (i = 0; i< 128; i++) { if (firstWord[i] >Fjala e dytë [i]) (// Më shumë edhe nëse fjala e dytë ka përfunduar tashmë, sepse // atëherë ajo përfundon me zero cmpRezultat = 1; pushim;) përndryshe nëse (Fjala e parë [i]< secondWord[i]) { cmpResult = -1; break; } } printf("%d", cmpResult); getch(); }

Meqenëse çdo shkronjë ka një vlerë numerike, ato mund të krahasohen me njëra-tjetrën si numra. Përveç kësaj, zakonisht (por jo gjithmonë!) karakteret në tabelat e kodimit janë alfabetike. Prandaj, renditja sipas vlerës numerike do të jetë gjithashtu e renditur sipas alfabetit.

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:

  1. ju duhet të konvertoni fjalën e futur në shkronja të mëdha:
  2. #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:

  1. shenja e marrjes së adresës nuk është e nevojshme këtu, pasi emri i grupit, siç e dimë tashmë, është adresa
  2. 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:

  1. int atoi (char * str)
  2. atoli i gjatë (char * str)
  3. 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.

Përditësimi i fundit: 31.10.2015

Lidhja

Lidhja ose bashkimi i vargut mund të bëhet duke përdorur funksionin + ose duke përdorur metodën Concat:

String s1 = "përshëndetje"; vargu s2 = "botë"; vargu s3 = s1 + "" + s2; // rezultat: string "hello world" string s4 = String.Concat (s3, "!!!"); // rezultat: vargu "përshëndetje botë !!!" Console.WriteLine (s4);

Metoda Concat është një metodë statike e klasës String që merr dy vargje si parametra. Ka edhe versione të tjera të metodës që marrin një numër të ndryshëm parametrash.

Metoda Join mund të përdoret gjithashtu për të lidhur vargje:

Vargu s5 = "mollë"; string s6 = "një ditë"; string s7 = "mban"; string s8 = "një mjek"; string s9 = "larg"; vlerat e vargut = varg i ri (s5, s6, s7, s8, s9); String s10 = String.Join ("", vlerat); // rezultat: vargu "molla në ditë mban një mjek larg"

Metoda Join është gjithashtu statike. Versioni i metodës së përdorur më sipër merr dy parametra: një varg ndarës (në këtë rast, një hapësirë) dhe një grup vargjesh që do të lidhen dhe ndahen nga një ndarës.

Krahasoni vargjet

Metoda statike e Krahasimit përdoret për të krahasuar vargjet:

String s1 = "përshëndetje"; vargu s2 = "botë"; int rezultat = String.Krahaso (s1, s2); nëse (rezultati<0) { Console.WriteLine("Строка s1 перед строкой s2"); } else if (result >0) (Console.WriteLine ("Rreshti s1 vjen pas rreshtit s2");) tjetër (Console.WriteLine ("Linjat s1 dhe s2 janë identike");) // rezultati do të jetë "Rreshti s1 përpara rreshtit s2"

Ky version i metodës Krahaso merr dy vargje dhe kthen një numër. Nëse rreshti i parë është alfabetikisht më i lartë se i dyti, atëherë kthehet një numër më i vogël se zero. Përndryshe, kthehet një numër më i madh se zero. Dhe rasti i tretë - nëse vargjet janë të barabarta, atëherë numri 0 kthehet.

Në këtë rast, meqenëse karakteri h alfabetikisht është më i lartë se karakteri w, atëherë edhe rreshti i parë do të jetë më i lartë.

Kërko në varg

Duke përdorur metodën IndexOf, ne mund të përcaktojmë indeksin e shfaqjes së parë të një karakteri ose nënvargu të vetëm në një varg:

String s1 = "përshëndetje botë"; char ch = "o"; int indexOfChar = s1.IndexOf (ch); // është e barabartë me 4 Console.WriteLine (indexOfChar); string subString = "wor"; int indexOfSubstring = s1.IndexOf (nënString); // është e barabartë me 6 Console.WriteLine (indexOfSubstring);

Metoda LastIndexOf funksionon në një mënyrë të ngjashme, ajo gjen vetëm indeksin e shfaqjes së fundit të një karakteri ose nënvargu në një varg.

Një grup tjetër metodash ju lejon të zbuloni nëse një varg fillon ose mbaron me një nënvarg specifik. Metodat StartsWith dhe EndsWith janë krijuar për këtë. Për shembull, ne kemi një detyrë për të hequr të gjithë skedarët me shtesën exe nga një dosje:

Rruga e vargut = @ "C: \ SomeDir"; skedarët e vargut = Directory.GetFiles (rruga); për (int i = 0; i< files.Length; i++) { if(files[i].EndsWith(".exe")) File.Delete(files[i]); }

Ndarja e vargjeve

Me funksionin Split, ne mund të ndajmë një varg në një grup nënvargjesh. Si parametër, funksioni Split pranon një grup karakteresh ose vargjesh që do të shërbejnë si ndarës. Për shembull, le të numërojmë numrin e fjalëve në një term duke e ndarë atë me hapësirën e bardhë:

String text = "Dhe kjo është arsyeja pse ndodhi kështu"; varg fjalë = tekst.Ndarje (karakter i ri ("")); foreach (vargu s në fjalë) (Console.WriteLine (s);)

Kjo nuk është mënyra më e mirë për t'u ndarë sipas hapësirave, pasi ne mund të kemi disa hapësira të njëpasnjëshme në linjën hyrëse dhe hapësirat gjithashtu do të bien në grupin që rezulton, kështu që është më mirë të përdorim një version të ndryshëm të metodës:

Fjalët e vargut = tekst.Split (karakter i ri (""), StringSplitOptions.RemoveEmptyEntries);

Parametri i dytë StringSplitOptions.RemoveEmptyEntries thotë që të hiqen të gjitha nënvargjet boshe.

Prerja e një vargu

Përdorni funksionin Trim për të shkurtuar karakteret kryesore ose pasuese:

Teksti i vargut = "përshëndetje botë"; tekst = tekst.Trim (); // rezultat "hello world" text = text.Trim (new char ("d", "h")); // rezultat "ello worl"

Funksioni Trim pa parametra shkurton hapësirat kryesore dhe pasuese dhe kthen vargun e prerë. Për të specifikuar në mënyrë të qartë se cilat karaktere fillestare dhe mbaruese duhet të shkurtohen, ne mund t'i kalojmë funksionit një grup të atyre karaktereve.

Ky funksion ka homologë të pjesshëm: funksioni TrimStart shkurton karakteret fillestare dhe funksioni TrimEnd shkurton karakteret fundore.

Funksioni Substring ju lejon të prisni një pjesë specifike të një vargu:

String text = "Ditë e bukur"; // prerë duke filluar nga karakteri i tretë tekst = tekst.Nënvarg (2); // rezultati "dita e mirë" Console.WriteLine (tekst); // prerë nga fillimi në dy karakteret e fundit teksti = teksti.Nënstring (0, teksti. Gjatësia - 2); // rezultati është "i dashur" Console.WriteLine (tekst);

Funksioni Substring kthen gjithashtu vargun e prerë. Si parametër, versioni i parë i përdorur përdor indeksin nga i cili shkurtohet vargu. Versioni i dytë përdor dy parametra - indeksin e fillimit të prerjes dhe gjatësinë e pjesës së prerë të linjës.

Fut

Për të futur një rresht në tjetrin, përdorni funksionin Insert:

String text = "Ditë e bukur"; string subString = "i mrekullueshëm"; tekst = tekst.Insert (8, substring); Console.WriteLine (tekst);

Parametri i parë në funksionin Insert është indeksi në të cilin futet nënvargu, dhe parametri i dytë është nënvargu aktual.

Fshirja e rreshtave

Metoda Remove ndihmon për të hequr një pjesë të një vargu:

String text = "Ditë e bukur"; // indeksi i karakterit të fundit int ind = tekst.Gjatësia - 1; // prerë tekstin e karakterit të fundit = tekst.Hiq (ind); Console.WriteLine (tekst); // prerë dy karakteret e para text = text.Remove (0, 2);

Versioni i parë i metodës Remove pranon një indeks në vargun nga i cili hiqen të gjithë karakteret. Versioni i dytë pranon një parametër më shumë - sa karaktere për të hequr.

Zëvendësimi

Për të zëvendësuar një karakter ose nënvarg me një tjetër, zbatohet metoda Replace:

String text = "ditë e bukur"; tekst = tekst.Zëvendëso ("mirë", "keq"); Console.WriteLine (tekst); tekst = tekst.Replace ("rreth", ""); Console.WriteLine (tekst);

Në rastin e dytë të përdorimit të funksionit Replace, një varg me një simbol "o" zëvendësohet me një varg bosh, domethënë, në fakt hiqet nga teksti. Në mënyrë të ngjashme, është e lehtë të fshish disa tekste specifike në rreshta.

Ndryshimi i rastit

Për të kthyer një varg në shkronja të mëdha dhe të vogla, përdoren funksionet ToUpper () dhe ToLower (), përkatësisht:

String hello = "Përshëndetje botë!"; Console.WriteLine (hello.ToLower ()); // Përshendetje Botë! Console.WriteLine (hello.ToUpper ()); // PËRSHENDETJE BOTË!

Artikujt kryesorë të lidhur