Kako podesiti pametne telefone i računare. Informativni portal

Operacije sa nizovima. Rad sa žicama

Strings. I/O linije. Formatirani I/O. Obrada nizova pomoću standardnih funkcija C. Rad sa memorijom.

1.1. Deklaracija i inicijalizacija stringova.

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

char s1; // niz dugačak devet znakova

char * s2; // pokazivač na string

Razlika između s1 i s2 je u tome što je s1 imenovana konstanta, a s2 varijabla.

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

"Ovo je niz."

Dužina konstante stringa ne može premašiti 509 znakova po standardu. Međutim, mnoge implementacije dozvoljavaju duže nizove.

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

char s1 = “Ovo je string.”;

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

1.2. I/O linije.

Da biste unijeli niz iz konzole, koristite funkciju

char * dobija (char * str);

koji upisuje string u str i vraća adresu unesenog niza. Funkcija zaustavlja unos kada naiđe na znak '\ n' ili EOF (kraj datoteke). Znak novog reda se ne kopira. Nulti bajt se stavlja na kraj reda za čitanje. U slučaju uspjeha, funkcija vraća pokazivač na pročitani niz, a u slučaju neuspjeha, NULL.

Za izlaz linije na konzolu koristite standardnu ​​funkciju

int stavlja (const char * s);

koji vraća nenegativan broj za uspjeh, a EOF za neuspjeh.

Prototipovi funkcija get i puts opisani su u datoteci zaglavlja stdio.h.

#include

printf ("Ulazni niz:");

1.3. Formatirani I/O.

Za formatirani unos podataka sa konzole koristite funkciju

int scanf (const char * format, ...);

koji, ako je uspješan, vraća broj jedinica pročitanih podataka, a ako nije, vraća EOF. Parametar formata mora pokazivati ​​na formatirani niz koji sadrži specifikacije ulaznih formata. Broj i tipovi argumenata koji prate niz formata moraju odgovarati broju i tipovima ulaznih formata navedenih u nizu formata. Ako ovaj uvjet nije ispunjen, onda je rezultat funkcije nepredvidiv.

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

Literalni znakovi u nizu formata, sa izuzetkom znaka %, zahtijevaju da se potpuno isti znakovi pojave u ulaznom toku. Ako ne postoji takav znak, scanf zaustavlja unos. Funkcija scanf preskače literalne znakove.

Općenito, specifikacija ulaznog formata je:

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

Znak '*' označava preskakanje prilikom ulaska u polje definisano ovom specifikacijom;

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

Tip može imati sljedeće vrijednosti:

c - niz znakova,

s - niz znakova, nizovi su odvojeni praznim znakovima,

d - cijeli broj sa predznakom u 10 s/s,

i je ceo broj sa predznakom, sistem brojeva zavisi od prve dve cifre,

u - cijeli broj bez predznaka pri 10 s/s,

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

x, X - neoznačeni cijeli broj u 16 s/s,

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

p je pokazivač na pokazivač,

n je pokazivač na cijeli broj,

[...] - niz skeniranih znakova, na primjer,.

U potonjem slučaju, samo znakovi zatvoreni u uglastim zagradama bit će uneseni iz ulaznog toka. Ako je prvi znak unutar uglastih zagrada „^“, tada se unose samo oni znakovi koji nisu u nizu. Opseg znakova u nizu je specificiran pomoću simbola '-'. Prilikom unosa znakova unose se i početna praznina i završni nul-bajt niza.

Modifikatori mogu imati sljedeće vrijednosti:

h - kratki cijeli broj,

l, L - dugi cijeli broj ili float,

i koriste se samo za cijele brojeve ili float.

Sljedeći primjer pokazuje slučajeve upotrebe funkcije scanf. Imajte na umu da postoji razmak ispred specificatora formata, počevši od unosa plutajućeg broja.

#include

printf ("Unesite cijeli broj:");

scanf ("% d", & n);

printf ("Unesite dvostruko:");

scanf ("% lf", & d);

printf ("Unesite znak:");

scanf ("% c", & c);

printf ("Unesite string:");

scanf ("% s", & s);

Imajte na umu da je u ovom programu broj s pomičnim zarezom inicijaliziran. Ovo se radi kako bi kompajler uključio biblioteku koja podržava rad sa plutajućim brojevima. Ako to ne učinite, dovest će do greške u vremenu izvođenja prilikom unosa plutajućeg broja.

Za formatiran izlaz na konzolu, koristite funkciju

int printf (const char * format, ...);

koji, ako je uspješan, vraća broj jedinica izlaznih podataka, a ako nije, vraća EOF. Parametar formata je formatirani niz koji sadrži specifikacije za izlazne formate. Broj i tipovi argumenata koji prate niz formata moraju odgovarati broju i tipovima specifikacija izlaznog formata datim u nizu formata. Općenito, specifikacija izlaznog formata je:

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

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

- ‘širina’ definira minimalni broj znakova prikazanih prema ovoj specifikaciji;

- '.precision' definira maksimalan broj znakova koji će se prikazati;

- ‘modifikatori’ određuju vrstu argumenata;

- 'tip' definira tip argumenta.

Potpisani cijeli brojevi izlaze u sljedećem formatu:

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

- - poravnanje lijevo, po defaultu - desno;

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

'Razmak' - na poziciji znaka se prikazuje razmak;

d - tip podataka int.

Sljedeći izlazni format se koristi za izlaz neoznačenih cijelih brojeva:

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

# - početna 0 se prikazuje za brojeve u 8 c/s, ili početna 0x ili 0X za brojeve u 16 c/s,

l - modifikator tipa long podataka;

u - cijeli broj u 10c/s,

o - cijeli broj u 8 s/s,

x, X je cijeli broj od 16 s/s.

Za brojeve s pomičnim zarezom koristi se sljedeći izlazni format:

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

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

f - broj fiksne tačke,

e - broj u eksponencijalnom obliku, eksponent je označen slovom "e",

E - broj u eksponencijalnom obliku, eksponent je označen slovom "E",

g - najkraći od f ili g formata,

G je najkraći od f ili G formata.

printf ("n =% d \ n f =% f \ n e =% e \ n E =% E \ n f =% .2f", -123, 12.34, 12.34, 12.34, 12.34);

// ispisuje: n = 123 f = 12,340000 e = 1,234000e + 001 E = 1,234000E + 001 f = 12,34

1.4. Formatiranje stringova.

Postoje varijante funkcija scanf i printf za formatiranje stringova i zovu se sscanf i sprintf, respektivno.

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

čita podatke iz niza specificiranog parametrom str u skladu sa nizom formata specificiranim parametrom formata. Vraća količinu pročitanih podataka u slučaju uspjeha i EOF u slučaju neuspjeha. Na primjer,

#include

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

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

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

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

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

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

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

formatira string prema formatu specificiranom parametrom formata i upisuje rezultat u međuspremnik niza znakova. Funkcija vraća broj znakova upisanih u bafer niza znakova, isključujući završni nul-bajt. Na primjer,

#include

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

char s = "Ovo je string.";

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

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

1.5. Pretvaranje nizova u numeričke podatke.

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

Za pretvaranje stringa u cijeli broj koristite funkciju

int atoi (const char * str);

char * str = “-123”;

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

Da konvertujete niz u dugi cijeli broj, koristite funkciju

long int atol (const char * str);

koji, ako je uspješan, vraća cijeli broj u koji je string string konvertiran, a ako 0 ne uspije, na primjer,

char * str = “-123”;

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

Da konvertujete string u dvostruki, koristite funkciju

dupli atof (const char * str);

koji, ako je uspješan, vraća plutajući broj tipa double, u koji je string string konvertiran, a ako 0 ne uspije, na primjer,

char * str = “-123.321”;

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

Sljedeće funkcije izvode radnje slične funkcijama atoi, atol, atof, ali pružaju naprednije funkcije.

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

pretvara string str u long int, koji vraća. Parametri ove funkcije imaju sljedeće značenje.

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

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

Ako je prvi znak cifra 0, a drugi cifra od 1 do 7, tada se pretpostavlja da je broj predstavljen u 8 c/s;

Ako je prvi znak 0, a drugi 'X' ili 'x', pretpostavlja se da je broj predstavljen u 16 c/s.

Ako je baza broj između 2 i 36, tada se ova vrijednost uzima kao osnova baze i bilo koji znak izvan ove baze zaustavlja konverziju. Osnove od 11 do 36 koriste znakove 'A' do 'Z' ili 'a' do 'z' za predstavljanje brojeva.

Argument endptr postavlja strtol funkcija. Ova vrijednost sadrži pokazivač na znak koji je zaustavio konverziju str. Ako je uspješna, strtol funkcija vraća konvertirani broj, a ako ne uspije, vraća 0. Na primjer,

n = strtol (“12a”, & p, 0);

printf (“n =% ld,% stop =% c, n, * p); // n = 12, stop = a

n = strtol (“012b”, & p, 0);

printf (“n =% ld,% stop =% c, n, * p); // n = 10, stop = b

n = strtol (“0x12z”, & p, 0);

printf (“n =% ld,% stop =% c, n, * p); // n = 18, stop = z

n = strtol (“01117”, & p, 0);

printf (“n =% ld,% stop =% c, n, * p); // n = 7, stop = 7

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

radi slično kao strtol, ali pretvara karakternu reprezentaciju broja u neoznačeni dugi int.

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

pretvara karakterni prikaz broja u dvostruki.

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

Osim toga, ako vrijednost znakova broja prelazi raspon važećih vrijednosti za odgovarajući tip podataka, tada funkcije atof, strtol, strtoul, strtod postavljaju vrijednost errno varijable na ERANGE. Varijabla errno i konstanta ERANGE definirane su u datoteci zaglavlja math.h. U ovom slučaju, atof i strtod funkcije vraćaju HUGE_VAL vrijednost, strtol funkcija vraća LONG_MAX ili LONG_MIN vrijednost, a strtoul funkcija vraća ULONG_MAX vrijednost.

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

1.6. Standardne funkcije za rad sa stringovima.

Ovaj odjeljak opisuje funkcije za rad sa stringovima, čiji su prototipovi opisani u datoteci zaglavlja string.h.

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

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

leksikografski upoređuje str1, str2 i vraća –1, 0 ili 1 ako je str1 manji, jednak ili veći od str2.

int strncmp (const char * str1, const char * str2, size_t n);

leksikografski upoređuje najviše n prvih znakova iz str1 i str2. Funkcija vraća -1, 0 ili 1 ako je prvih n znakova iz stringa str1 manje, jednako ili veće od prvih n znakova iz string str2.

// primjer poređenja nizova

#include

#include

char str1 = "aa bb";

char str2 = "aa aa";

char str3 = "aa bb cc";

printf ("% d \ n", strcmp (str1, str3)); // ispisuje: -1

printf ("% d \ n", strcmp (str1, str1)); // ispisuje: -0

printf ("% d \ n", strcmp (str1, str2)); // ispisuje: 1

printf ("% d \ n", strncmp (str1, str3, 5)); // ispisuje: 0

2. Kopiranje linija. Funkcije strcpy i strncpy se koriste za kopiranje nizova.

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

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

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

kopira n znakova iz string str2 u string str1. Ako string str2 sadrži manje od n znakova, tada se posljednji nul bajt kopira onoliko puta koliko je potrebno da se string str2 proširi na n znakova. Funkcija vraća pokazivač na string str1.

char str2 = "Kopiraj string.";

strcpy (str1, str2);

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

4. Konkatenacija nizova. Funkcije strcat i strncat se koriste za spajanje nizova u jedan string.

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

dodaje string str2 stringu str1, sa brisanim završnim nul-bajtom stringa str1. Funkcija vraća pokazivač na string str1.

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

dodaje n znakova iz string str2 u string str1, a završni nul bajt string str1 se briše. Funkcija vraća pokazivač na string str1. ako je dužina stringa str2 manja od n, tada se dodaju samo znakovi uključeni u string str2. Nakon spajanja stringova, nulti bajt se uvijek dodaje str1. Funkcija vraća pokazivač na string str1.

#include

#include

char str1 = "String";

char str2 = "catenation";

char str3 = "Da Ne";

strcat (str1, str2);

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

strncat (str1, str3, 3);

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

5. Potražite znak u nizu. Funkcije strchr, strrchr, strspn, strcspn i strpbrk se koriste za traženje karaktera u nizu.

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

traži prvo pojavljivanje znaka specificiranog parametrom c u stringu str. U slučaju uspjeha, funkcija vraća pokazivač na prvi pronađeni znak, a u slučaju neuspjeha, NULL.

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

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

#include

#include

char str = "Traženje znakova";

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

printf ("% s \ n", strrchr (str, "r")); // ispisuje: rch

size_t strspn (const char * str1, const char * str2);

vraća indeks prvog znaka iz string str1 koji nije u string str2.

size_t strcspn (const char * str1, const char * str2);

vraća indeks prvog znaka iz string str1 koji ide u string str2.

char str = "123 abc";

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

printf ("n =% d \ n", strcspn (str, "cba"); // ispisuje: n = 4

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

pronalazi prvi znak u stringu str1 koji je jednak jednom od znakova u stringu str2. U slučaju uspjeha, funkcija vraća pokazivač na ovaj znak, a u slučaju neuspjeha, NULL.

char str = "123 abc";

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

6. Poređenje žica. Funkcija strstr se koristi za poređenje stringova.

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

pronalazi prvo pojavljivanje stringa str2 (bez zadnjeg null bajta) u stringu str1. U slučaju uspjeha, funkcija vraća pokazivač na pronađeni podniz, a u slučaju neuspjeha, NULL. Ako str1 pokazivač pokazuje na string nulte dužine, funkcija vraća str1 pokazivač.

char str = "123 abc 456;

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

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

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

vraća pokazivač na sljedeći token (riječ) u nizu str1, u kojem su tokeni razgraničeni znakovima iz string str2. Ako su leksemi gotovi, funkcija vraća NULL. Prilikom prvog poziva funkcije strtok, parametar str1 mora pokazivati ​​na string koji se raščlanjuje u tokene, a na sljedećim pozivima ovaj parametar mora biti postavljen na NULL. Nakon pronalaženja tokena, strtok funkcija upisuje nulti bajt nakon ovog tokena umjesto separatora.

#include

#include

char str = "12 34 ab cd";

p = strtok (str, "");

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

p = strtok (NULL, "");

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

size_t strlen (const char * str);

vraća dužinu niza, isključujući posljednji null bajt. Na primjer,

char str = "123";

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

1.7. Funkcije za rad sa memorijom.

Datoteka zaglavlja string.h također opisuje funkcije za rad sa memorijskim blokovima, koje su slične odgovarajućim funkcijama za rad sa stringovima.

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

traži prvo pojavljivanje znaka specificiranog parametrom c u n bajtova str.

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

upoređuje prvih n bajtova str1 i str2.

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

kopira prvih n bajtova iz string str1 u string str2.

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

kopira prvih n bajtova iz string str1 u string str2, osiguravajući da se preklapajući nizovi pravilno rukuju.

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

kopira karakter specificiran parametrom c u prvih n bajtova str.

Tagovi: C linije. Char niz.

Žice u C. Uvod.

Ovo je uvodni članak red po red u si. Detaljniji opis i primjeri bit će kada naučimo raditi s memorijom i pokazivačima. U računaru se sve vrijednosti pohranjuju kao brojevi. I nizovi također, nema simbola ili slova. Termin je niz brojeva. Svaki broj odgovara određenom znaku, koji se uzima iz tabele kodiranja. Kada je prikazan na ekranu, simbol se prikazuje na određeni način.
Nizovi tipa char se koriste za pohranjivanje stringova. Ponavljam još jednom - tip char je numerički, pohranjuje jedan bajt podataka. Ali prema tablici kodiranja, svaki od ovih brojeva je povezan sa znakom. I u suprotnom smjeru - svaki znak je određen svojim serijskim brojem u tablici kodiranja.
na primjer

#include #include void main () (char c = "A"; int i = 65; printf ("prikaži kao char% c \ n", c); printf ("prikaži kao int% d \ n", c); printf (" prikazati kao char% c \ n ", i); printf (" prikazati kao char% d \ n ", i); getch ();)

Napravili smo dvije varijable, jednu ovog tipa char, druga int... Slovo "A" ima numeričku vrijednost 65. Ovo je literal, a ne niz, stoga je okruženo jednostrukim navodnicima. Možemo ga odštampati kao pismo

Printf ("prikaži kao char% c \ n", c);

Tada će se ispisati
A
Ako ga ispišete kao broj, bit će
65
Isto možete učiniti i sa brojem 65, koji je pohranjen u varijabli tipa int.
Posebni znakovi također imaju svoj broj

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

Ovdje će se prvo "prikazati" zvučni signal, zatim njegova brojčana vrijednost, pa opet zvučni signal.
String u C je niz tipa char, čiji posljednji element pohranjuje terminalni znak "\ 0". Numerička vrijednost ovog znaka je 0, tako da možemo reći da je niz završen nultom.
na primjer

#include #include void main () (char riječ; riječ = "A"; riječ = "B"; riječ = "C"; riječ = "\ 0"; // riječ = 0; ekvivalent printf ("% s", riječ) ;dobiti (;)

Za izlaz je korišten ključ% s. Ovo ispisuje string do prvog terminalnog znaka, jer funkcija printf ne zna veličinu niza riječi.
Ako u ovom primjeru ne stavite

Riječ = "\ 0";

tada će se prikazati niz znakova proizvoljne dužine sve dok se ne naiđe na prvi bajt ispunjen nulama.

#include #include void main () (char riječ = "ABC"; char tekst = ("H", "E", "L", "L", "O"); printf ("% s \ n", riječ); printf ("% s", tekst); getch ();)

U ovom slučaju, sve je tačno. Niz "ABC" završava nulom i njime inicijaliziramo niz riječi. Tekst stringa se inicijalizira slovo po slovo, svi preostali znakovi, kao što slijedi iz poglavlja o nizovima, popunjeni su nulama.

Čitanje redova

Da bi se od korisnika zatražilo string, mora se kreirati bafer. Veličina bafera mora biti odabrana unaprijed, kako bi unesena riječ stala u njega. Prilikom čitanja linija postoji opasnost da korisnik unese više podataka nego što to bafer dozvoljava. Ovi podaci će biti pročitani i smješteni u memoriju, te će prepisati vrijednosti drugih ljudi. Dakle, napad se može izvesti upisivanjem potrebnih bajtova, u kojima, na primjer, vrijedi otići do dijela koda sa zlonamjernim programom ili evidentirati podatke.

#include #include void main () (char bafer; scanf ("% 19s", bafer); printf ("% s", bafer); getch ();)

U ovom slučaju, broj unesenih znakova je ograničen na 19, a veličina bafera je za 1 veća, jer je potrebno pohraniti terminalni znak. Napišimo jednostavan program koji od korisnika traži string i vraća njegovu dužinu.

#include #include void main () (char buffer; unsigned len = 0; scanf ("% 127s", bafer); while (buffer! = "\ 0") (len ++;) printf ("length (% s) ==% d" , tampon, len); getch (;)

Pošto je numerička vrijednost znaka "\ 0" jednaka nuli, možete pisati

Dok (bafer! = 0) (len ++;)

Ili, još kraće

Dok (bafer) (len ++;)

Sada napišimo program koji od korisnika traži dvije riječi i upoređuje ih

#include #include / * Rezultat poređenja bit će broj 0 ako su riječi 1 ako je prva riječ veća od druge u leksikografskom redu -1 ako je druga riječ veća od * / void main () (char firstWord; // Prva riječ char secondWord; // Druga riječ bez znaka i; / / Brojač int cmpResult = 0; // Rezultat poređenja scanf ("% 127s", prva riječ); scanf ("% 127s", secondWord); for (i = 0; i< 128; i++) { if (firstWord[i] >secondWord [i]) (// Više čak i ako je druga riječ već završila, jer // tada završava sa nula cmpResult = 1; break;) inače if (prva riječ [i]< secondWord[i]) { cmpResult = -1; break; } } printf("%d", cmpResult); getch(); }

Pošto svako slovo ima numeričku vrijednost, mogu se međusobno upoređivati ​​kao brojevi. Osim toga, obično je (ali ne uvijek!) da su znakovi u tabelama kodiranja abecedni. Stoga će sortiranje po brojčanoj vrijednosti također biti sortiranje po abecednom redu.

Biblioteka funkcija C i C ++ uključuje bogat skup funkcija za rukovanje nizovima i znakovima. Funkcije stringova rade na nizovima znakova koji se završavaju nulom. U jeziku C, da biste koristili string funkcije, morate uključiti datoteku zaglavlja na početak programskog modula , a za simboličku - datoteku zaglavlja ... C ++ koristi zaglavlja za rad sa funkcijama stringova i znakova. i respektivno. Ovo poglavlje koristi imena C-zaglavlja radi jednostavnosti.

Budući da u jezicima C i C ++ prilikom izvođenja operacija s nizovima nije predviđena automatska kontrola kršenja njihovih granica, sva odgovornost za prelijevanje nizova pada na ramena programera. Zanemarivanje ovih suptilnosti može dovesti do pada programa.

U C i C ++, znakovi za ispis su znakovi prikazani na terminalu. U ASCII okruženjima, oni se nalaze između razmaka (0x20) i tilde (OxFE). Kontrolni znakovi imaju vrijednosti između nule i Ox1F; oni takođe uključuju DEL simbol (Ox7F).

Istorijski gledano, argumenti simboličkih funkcija su cjelobrojne vrijednosti, od kojih se koristi samo najmanji bajt. Simboličke funkcije automatski pretvaraju svoje argumente u neoznačeni znak. Naravno, možete slobodno pozvati ove funkcije sa simboličkim argumentima, pošto se simboli automatski podižu na rang cijelih brojeva kada se funkcija pozove.

U naslovu Definiran je tip size_t, koji je rezultat operatora sizeof i vrsta je neoznačenog cijelog broja.

C99 je dodao kvalifikator ograničenja nekim parametrima nekoliko funkcija prvobitno definiranih u C89. O svakoj takvoj funkciji biće reči sa njenim prototipom koji se koristi u okruženju C89 (kao i u okruženju C++), a parametri sa restriktivnim atributom biće zabeleženi u opisu ove funkcije.

Lista funkcija

Provjera pripadnosti

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

Rad sa nizovima znakova

memchr - Prođite kroz niz da biste pronašli prvo pojavljivanje znaka
memcmp - Uspoređuje određeni broj znakova u dva niza
memcpy - Kopira znakove iz jednog niza u drugi
memmove - Kopira znakove iz jednog niza u drugi, uzimajući u obzir nizove koji se preklapaju
memset - popunjava određeni broj znakova u nizu datim

Manipulacija stringovima

strcat - Dodaj kopiju jednog niza datom
strchr - Vraća pokazivač na prvo pojavljivanje najmanje značajnog bajta datog parametra
strcmp - Upoređuje leksikografski dva niza
strcoll - Uspoređuje jedan string s drugim prema setlocale
strcpy - Kopira sadržaj jednog stringa u drugi
strcspn - Vraća string bez specificiranih znakova
strerror - Vraća pokazivač na niz koji sadrži poruku o sistemskoj grešci
strlen - Vraća dužinu niza koji je završen nulom

Nije slučajno što sam temu o stringovima stavio u sekciju "Nizovi". Pošto je string, u stvari, niz znakova. Evo primjera:

char str = "To je samo string";

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

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

One. isti niz, samo se sastoji od simbola. Stoga, možete raditi s njim na isti način kao i sa nizovima cijelih brojeva.

A sada da probamo rad sa žicama u c... U uvodnim lekcijama smo shvatili da su likovi cjelobrojni tipovi, tj. svaki znak ima svoju numeričku vrijednost. Evo primjera i rješenja:

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

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

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

    Povratak 0;
    }

    da biste dobili brojčani kod, samo upotrijebite specifikaciju% d u funkciji printf. Da, i još jedna važna stvar: završetak bilo kojeg žice je nulti terminator, koji je označen posebnim znakom "\ 0".

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

char * str = "provod";

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

A evo kako možete unijeti nizove kroz naš izvorni scanf operator:

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

Postoje dvije suptilnosti:

  1. znak uzimanja adrese ovde nije potreban, pošto je ime niza, kao što već znamo, adresa
  2. Dužina ulaznog niza ne smije biti veća od 15 karaktera, jer posljednji mora biti nulti terminator. Štaviše, sam kompajler će popuniti ovaj znak nakon vašeg poslednjeg unetog znaka.

Pošto je jezik C strukturirani jezik, već postoje ugrađene funkcije za rad sa žicama i sa simbolima. Da obradite nizove, morate uključiti datoteku: ctype.h. Datoteka sadrži funkcije za određivanje velikih i malih slova, formata znakova. U osnovi, sve što trebate znati o simbolu može se učiniti korištenjem funkcija u datoteci ctype.h.

Ponekad ćete možda morati da konvertujete niz u drugi tip podataka. Biblioteka stdlib postoji za prevođenje stringova u druge tipove. Evo njegovih funkcija:

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

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

Posljednje ažurirano: 31.10.2015

Konkatenacija

Konkatenacija ili spajanje nizova može se izvršiti pomoću operacije + ili pomoću metode Concat:

String s1 = "zdravo"; string s2 = "svijet"; string s3 = s1 + "" + s2; // rezultat: string "zdravo svijet" string s4 = String.Concat (s3, "!!!"); // rezultat: string "hello world !!!" Console.WriteLine (s4);

Metoda Concat je statička metoda klase String koja uzima dva niza kao parametre. Postoje i druge verzije metode koje uzimaju drugačiji broj parametara.

Metoda Join se također može koristiti za spajanje nizova:

String s5 = "jabuka"; string s6 = "dan"; string s7 = "čuva"; string s8 = "doktor"; string s9 = "u gostima"; vrijednosti niza = novi niz (s5, s6, s7, s8, s9); String s10 = String.Join ("", vrijednosti); // rezultat: string "jabuka na dan drži doktora podalje"

Metoda Join je također statična. Verzija metode koja se koristi iznad prima dva parametra: string za razdvajanje (u ovom slučaju, razmak) i niz stringova koji će biti spojeni i odvojeni separatorom.

Uporedite žice

Statička metoda Compare se koristi za poređenje nizova:

String s1 = "zdravo"; string s2 = "svijet"; int rezultat = String.Compare (s1, s2); ako (rezultat<0) { Console.WriteLine("Строка s1 перед строкой s2"); } else if (result >0) (Console.WriteLine ("Linija s1 dolazi nakon linije s2");) inače (Console.WriteLine ("Linije s1 i s2 su identične");) // rezultat će biti "Linija s1 prije linije s2"

Ova verzija metode Compare uzima dva niza i vraća broj. Ako je prvi red po abecedi veći od drugog, onda se vraća broj manji od nule. U suprotnom, vraća se broj veći od nule. I treći slučaj - ako su stringovi jednaki, onda se vraća broj 0.

U ovom slučaju, pošto je znak h po abecednom redu viši od znaka w, tada će i prvi red biti viši.

Traži u nizu

Koristeći metodu IndexOf, možemo odrediti indeks prvog pojavljivanja jednog znaka ili podniza u nizu:

String s1 = "zdravo svijete"; char ch = "o"; int indexOfChar = s1.IndexOf (ch); // jednako 4 Console.WriteLine (indexOfChar); string subString = "rad"; int indexOfSubstring = s1.IndexOf (podniz); // jednako 6 Console.WriteLine (indexOfSubstring);

Metoda LastIndexOf radi na sličan način, samo pronalazi indeks posljednjeg pojavljivanja znaka ili podniza u nizu.

Druga grupa metoda vam omogućava da saznate da li niz počinje ili završava određenim podnizom. Za to su dizajnirane metode StartsWith i EndsWith. Na primjer, imamo zadatak ukloniti sve datoteke s ekstenzijom exe iz mape:

Putanja niza = @ "C: \ SomeDir"; string files = Directory.GetFiles (putanja); za (int i = 0; i< files.Length; i++) { if(files[i].EndsWith(".exe")) File.Delete(files[i]); }

Razdvajanje žica

Pomoću funkcije Split možemo podijeliti niz u niz podstringova. Kao parametar, funkcija Split prihvaća niz znakova ili nizova koji će služiti kao separatori. Na primjer, izbrojimo broj riječi u pojmu tako što ćemo ga podijeliti razmakom:

String text = "I zato se desilo ovako"; niz riječi = text.Split (novi znak ("")); foreach (niz s u riječima) (Console.WriteLine (s);)

Ovo nije najbolji način za razdvajanje razmacima, jer bismo mogli imati nekoliko uzastopnih razmaka u ulaznoj liniji, a razmaci bi također upali u rezultirajući niz, pa je bolje koristiti drugu verziju metode:

String riječi = text.Split (novi znak (""), StringSplitOptions.RemoveEmptyEntries);

Drugi parametar StringSplitOptions.RemoveEmptyEntries kaže da treba ukloniti sve prazne podnizove.

Podrezivanje niza

Upotrijebite funkciju Trim da skratite početne ili zadnje znakove:

String text = "zdravo svijete"; tekst = tekst.Obrezivanje (); // rezultat "hello world" text = text.Trim (novi char ("d", "h")); // rezultat "ello worl"

Funkcija Trim bez parametara skraćuje početne i zadnje razmake i vraća skraćeni niz. Da bismo eksplicitno odredili koje početne i završne znakove treba skratiti, možemo proslijediti niz tih znakova funkciji.

Ova funkcija ima djelomične parnjake: funkcija TrimStart skraćuje početne znakove, a funkcija TrimEnd završne znakove.

Funkcija Substring vam omogućava da odsiječete određeni dio niza:

String text = "Lep dan"; // odrezan počevši od trećeg znaka text = text.Substring (2); // rezultat "dobar dan" Console.WriteLine (tekst); // odsjeci prvi do zadnja dva znaka text = text.Substring (0, text.Length - 2); // rezultat je "dragi" Console.WriteLine (tekst);

Funkcija Substring također vraća skraćeni niz. Kao parametar, prva korištena verzija koristi indeks iz kojeg se skraćuje niz. Druga verzija koristi dva parametra - indeks početka obrezivanja i dužinu odsječenog dijela linije.

Insert

Da umetnete jedan red u drugi, koristite funkciju Insert:

String text = "Lep dan"; string subString = "prekrasno"; text = text.Insert (8, podniz); Console.WriteLine (tekst);

Prvi parametar u funkciji Insert je indeks u koji treba umetnuti podniz, a drugi parametar je stvarni podniz.

Brisanje redova

Metoda Remove pomaže u uklanjanju dijela niza:

String text = "Lep dan"; // indeks posljednjeg znaka int ind = text.Length - 1; // izrezati zadnji znak text = text.Remove (ind); Console.WriteLine (tekst); // izrezati prva dva znaka text = text.Remove (0, 2);

Prva verzija metode Remove prihvata indeks u nizu iz kojeg se uklanjaju svi znakovi. Druga verzija prihvata još jedan parametar - koliko znakova treba ukloniti.

Zamjena

Za zamjenu jednog znaka ili podniza drugim, primjenjuje se metoda Zamijeni:

String text = "lijep dan"; text = text.Replace ("dobro", "loše"); Console.WriteLine (tekst); text = text.Replace ("o", ""); Console.WriteLine (tekst);

U drugom slučaju korištenja funkcije Replace, niz od jednog simbola "o" zamjenjuje se praznim nizom, odnosno uklanja se iz teksta. Na sličan način, lako je izbrisati određeni tekst u redovima.

Promjena slučaja

Za pretvaranje niza u velika i mala slova, koriste se funkcije ToUpper () i ToLower ():

String hello = "Zdravo svijete!"; Console.WriteLine (hello.ToLower ()); // Zdravo svijete! Console.WriteLine (hello.ToUpper ()); // ZDRAVO SVIJETE!

Top srodni članci