Kako postaviti pametne telefone i računala. Informativni portal

Operacije s nizovima. Rad sa nizovima

Linije. Ulaz/izlaz niza. Formatirani I/O. Obrada nizova pomoću standardnih funkcija jezika C. Rad s memorijom.

1.1. Deklaracija i inicijalizacija stringova.

Niz je niz znakova koji završava praznim znakom '\0'. Niz se deklarira kao regularni niz znakova, na primjer,

char s1; // niz od devet znakova

char *s2; // pokazivač na string

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

Konstante niza nalaze se u dvostrukim navodnicima, za razliku od znakova koji su zatvoreni u jednostruke navodnike. Na primjer,

"Ovo je niz."

Duljina konstante niza ne smije premašiti 509 znakova prema standardu. Međutim, mnoge implementacije dopuštaju veće duljine niza.

Kada inicijalizirate nizove, bolje je ne specificirati veličinu niza; prevodilac će to učiniti tako da izračuna duljinu niza i doda mu jedan. Na primjer,

char s1 = “Ovo je niz.”;

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 s ovim funkcijama raspravljat ćemo u sljedećim paragrafima.

1.2. Ulaz/izlaz niza.

Za unos niza iz konzole koristite funkciju

char* dobiva(char *str);

koji ispisuje niz na adresu str i vraća adresu upisanog niza. Funkcija zaustavlja unos ako naiđe na znak '\n' ili EOF (kraj datoteke). Znak novog retka se ne kopira. Nulti bajt stavlja se na kraj čitane linije. Ako je uspješna, funkcija vraća pokazivač na pročitani redak, a ako ne uspije, vraća NULL.

Za ispis niza u konzolu koristite standardnu ​​funkciju

int stavlja (const char *s);

koji, ako je uspješan, vraća nenegativan broj, a ako je neuspješan, vraća EOF.

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

#uključi

printf("Ulazni niz: ");

1.3. Formatirani I/O.

Za formatirani unos podataka iz konzole koristite funkciju

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

koji, ako je uspješan, vraća broj jedinica pročitanih podataka, a ako je neuspješan, vraća EOF. Parametar formata mora ukazivati ​​na niz koji treba formatirati, a koji sadrži specifikacije ulaznog formata. Broj i tipovi argumenata koji slijede niz formata moraju odgovarati broju i vrstama ulaznih formata navedenih u nizu formata. Ako ovaj uvjet nije ispunjen, tada je rezultat funkcije nepredvidiv.

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

Doslovni znakovi u nizu formata, s iznimkom znaka %, zahtijevaju da se potpuno isti znakovi pojave u ulaznom toku. Ako nema takvog znaka, funkcija scanf prestaje unositi. Funkcija scanf preskače doslovne znakove.

Općenito, specifikacija ulaznog formata izgleda ovako:

%[*] [širina] [modifikatori] vrsta

Simbol '*' označava izostavljanje pri unosu polja definiranog ovom specifikacijom;

- ‘width’ definira najveći broj znakova unesenih prema ovoj specifikaciji;

Tip može uzeti sljedeće vrijednosti:

c – niz znakova,

s – niz znakova, linije su odvojene praznim znakovima,

d – cijeli broj s predznakom od 10 s/s,

i – cijeli broj s predznakom, brojevni sustav ovisi o prve dvije znamenke,

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

o – cijeli broj bez predznaka u 8 s/s,

x, X – cijeli broj bez predznaka pri 16 s/s,

e, E, f, g, G – pomični broj,

p – pokazivač na pokazivač,

n – pokazivač na cijeli broj,

[…] – niz skeniranih znakova, na primjer, .

U potonjem slučaju, iz ulaznog toka bit će uneseni samo znakovi u uglatim zagradama. Ako je prvi znak unutar uglatih zagrada '^', tada se unose samo oni znakovi koji nisu u nizu. Raspon znakova u nizu naveden je pomoću simbola '-'. Kada unesete znakove, također se unose početni prazni znakovi i završni nulti bajt niza.

Modifikatori mogu imati sljedeće vrijednosti:

h – kratki cijeli broj,

l, L – dugi cijeli broj ili plutajući,

i koriste se samo za cijele ili pokretne brojeve.

Sljedeći primjer pokazuje upotrebu funkcije scanf. Imajte na umu da specifikatoru formata, počevši s unosom plutajućeg broja, prethodi razmak.

#uključi

printf("Unesite cijeli broj: ");

scanf("%d", &n);

printf("Unesite dvostruko: ");

scanf(" %lf", &d);

printf("Unesite znak: ");

scanf(" %c", &c);

printf("Unesite niz: ");

scanf(" %s", &s);

Imajte na umu da se u ovom programu inicijalizira broj s pomičnim zarezom. Ovo je učinjeno tako da prevoditelj uključuje biblioteku za podršku rada s pokretnim brojevima. Ako se to ne učini, pojavit će se pogreška tijekom izvođenja prilikom unosa plutajućeg broja.

Za formatirani izlaz podataka na konzolu koristite funkciju

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

koji, ako je uspješan, vraća broj jedinica izlaza podataka, a ako je neuspješan, vraća EOF. Parametar formata je niz formata koji sadrži specifikacije za izlazne formate. Broj i tipovi argumenata koji slijede niz formata moraju odgovarati broju i tipovima specifikacija izlaznog formata navedenim u nizu formata. Općenito, specifikacija izlaznog formata izgleda ovako:

%[flags] [width] [.precision] [modifiers] tip

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

- 'width' definira minimalni broj znakova u izlazu prema ovoj specifikaciji;

- ‘.precision’ definira najveći broj prikazanih znakova;

- 'modifikatori' određuju vrstu argumenata;

- 'type' specificira tip argumenta.

Za ispis cijelih brojeva s predznakom koristi se sljedeći izlazni format:

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

- – poravnanje lijevo, zadano – desno;

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

‘razmak’ – razmak se prikazuje na poziciji znaka;

d – tip podataka int.

Za ispis nepredznačenih cijelih brojeva koristite sljedeći izlazni format:

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

# – početna 0 izlazi za brojeve u 8 c/c ili početna 0x ili 0X za brojeve u 16 c/c,

l – modifikator dugog tipa podataka;

u – cijeli broj u 10c/c,

o – cijeli broj u 8 c/c,

x, X – cijeli broj na 16 c/c.

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

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

"preciznost" - označava broj znamenki iza decimalne točke za formate f, e i E ili broj značajnih znamenki za formate g i G. Brojevi se zaokružuju. Zadana preciznost je šest decimalnih znamenki;

f – broj fiksne točke,

e – broj u eksponencijalnom obliku, eksponent se označava slovom “e”,

E – broj u eksponencijalnom obliku, eksponent se označava slovom “E”,

g – najkraći od f ili g formata,

G – najkraći od f ili G formata.

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

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

1.4. Oblikovanje nizova.

Postoje varijante funkcija scanf i printf koje su dizajnirane za formatiranje nizova i nazivaju se sscanf odnosno sprintf.

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

čita podatke iz niza navedenog pomoću str, prema nizu formata određenom pomoću format. Ako je uspješno, vraća broj pročitanih podataka, a ako je neuspješno, vraća EOF. Na primjer,

#uključi

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

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

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

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

printf("%f\n", d); // ispisuje: 1.200000

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

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

formatira niz u skladu s formatom navedenim parametrom formata i zapisuje rezultirajući rezultat u međuspremnik niza znakova. Funkcija vraća broj znakova upisanih u međuspremnik niza znakova, isključujući završni nulti bajt. Na primjer,

#uključi

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

char s = "Ovo je niz.";

sprintf(međuspremnik, str, c, n, d, s);

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

1.5. Pretvorite nizove u numeričke podatke.

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

Za pretvaranje niza u cijeli broj upotrijebite funkciju

int atoi (const char *str);

char *str = “-123”;

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

Za pretvaranje niza u dugi cijeli broj upotrijebite funkciju

long int atol (const char *str);

koji, ako je uspješan, vraća cijeli broj u koji je string konvertiran, a ako je neuspješan, vraća 0. Na primjer,

char *str = “-123”;

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

Za pretvaranje niza u dvostruki broj upotrijebite funkciju

dvostruko atof(const char *str);

koji, ako je uspješan, vraća plutajući broj tipa double, u koji se pretvara niz str, a ako ne uspije, vraća 0. Na primjer,

char *str = “-123.321”;

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

Sljedeće funkcije izvode slične funkcije kao atoi, atol, atof, ali pružaju napredniju funkcionalnost.

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

pretvara niz str u dugi int broj, koji vraća. Parametri ove funkcije imaju sljedeće svrhe.

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

Ako je prvi znak broj od 1 do 9, tada se pretpostavlja da je broj predstavljen u 10 c/c;

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

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

Ako je baza broj između 2 i 36, tada se ta vrijednost uzima kao baza brojevnog sustava, a bilo koji znak izvan brojevnog sustava prestaje se pretvarati. U brojevnim sustavima od baze 11 do baze 36, simboli 'A' do 'Z' ili 'a' do 'z' koriste se za predstavljanje znamenki.

Vrijednost argumenta endptr postavlja funkcija strtol. Ova vrijednost sadrži pokazivač na znak koji je zaustavio pretvaranje niza str. Funkcija strtol vraća pretvoreni broj ako je uspješno, i 0 ako je neuspješno. 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 funkciji strtol, ali pretvara simboličku reprezentaciju broja u broj tipa unsigned long int.

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

Pretvara simbolički prikaz broja u dvostruko.

Sve funkcije navedene u ovom paragrafu prestaju raditi kada naiđu na prvi znak koji ne odgovara formatu dotičnog broja.

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

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

1.6. Standardne funkcije za rad sa stringovima.

Ovaj odjeljak govori o funkcijama za rad s nizovima, čiji su prototipovi opisani u datoteci zaglavlja string.h.

1. Usporedba nizova. Funkcije strcmp i strncmp koriste se za usporedbu nizova.

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

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

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

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

// primjer usporedbe stringova

#uključi

#uključi

char str1 = "aa bb";

char str2 = "aa aa";

char str3 = "aa bb cc";

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

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

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

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

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

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

kopira niz str2 u niz str1. Kopira se cijeli niz str2, uključujući završni nulti bajt. Funkcija vraća pokazivač na str1. Ako se linije preklapaju, rezultat je nepredvidiv.

char *strncpy (char *str1, const char *str2, veličina_t n);

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

char str2 = "Kopiraj niz.";

strcpy(str1, str2);

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

4. Povezivanje struna. Funkcije strcat i strncat koriste se za spajanje nizova u jedan niz.

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

dodaje string str2 nizu str1, pri čemu se zadnji nulti bajt niza str1 briše. Funkcija vraća pokazivač na string str1.

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

dodaje n znakova iz niza str2 u niz str1, pri čemu se zadnji nulti bajt niza str1 briše. Funkcija vraća pokazivač na string str1. ako je duljina niza str2 manja od n, tada se dodaju samo znakovi uključeni u niz str2. Nakon ulančavanja nizova, str1 se uvijek dodaje nulti bajt. Funkcija vraća pokazivač na string str1.

#uključi

#uključi

char str1 = "Niz";

char str2 = "katenacija";

char str3 = "Da Ne";

strcat(str1, str2);

printf("%s\n", str1); // ispisuje: katenacija niza

strncat(str1, str3, 3);

printf("%s\n", str1); // ispisuje: Katetacija niza Da

5. Potražite znak u nizu. Za traženje znaka u nizu koristite funkcije strchr, strrchr, strspn, strcspn i strpbrk.

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

traži prvo pojavljivanje znaka navedenog sa c u nizu str. Ako je uspješna, funkcija vraća pokazivač na prvi pronađeni znak, a ako ne uspije, vraća NULL.

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

traži zadnje pojavljivanje znaka navedenog sa c u nizu str. Ako je uspješna, funkcija vraća pokazivač na posljednji pronađeni znak, a ako ne uspije, vraća NULL.

#uključi

#uključi

char str = "Pretraživanje znakova";

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

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

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

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

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

vraća indeks prvog znaka iz str1 koji se pojavljuje u str2.

char str = "123 abc";

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

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

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

pronalazi prvi znak u nizu str1 koji je jednak jednom od znakova u nizu str2. Ako je uspješna, funkcija vraća pokazivač na ovaj znak, a ako ne uspije, vraća NULL.

char str = "123 abc";

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

6. Usporedba nizova. Funkcija strstr koristi se za usporedbu nizova.

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

pronalazi prvo pojavljivanje str2 (bez nula bajta na kraju) u str1. Ako je uspješna, funkcija vraća pokazivač na pronađeni podniz, a ako ne uspije, vraća NULL. Ako pokazivač str1 pokazuje na niz nulte duljine, tada funkcija vraća pokazivač str1.

char str = "123 abc 456;

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

7. Raščlanjivanje niza u žetone. Funkcija strtok koristi se za rastavljanje niza u tokene.

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

vraća pokazivač na sljedeći token (riječ) u nizu str1, u kojem su razdjelnici tokena znakovi iz niza str2. Ako više nema tokena, funkcija vraća NULL. Pri prvom pozivu funkcije strtok, parametar str1 mora ukazivati ​​na string koji je tokeniziran, a pri sljedećim pozivima ovaj parametar mora biti postavljen na NULL. Nakon pronalaska tokena, funkcija strtok zapisuje nulti bajt nakon ovog tokena umjesto graničnika.

#uključi

#uključi

char str = "12 34 ab cd";

p = strtok(str, " ");

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

p = strtok(NULL, " ");

8. Određivanje duljine niza. Funkcija strlen koristi se za određivanje duljine niza.

veličina_t strlen (const char *str);

vraća duljinu niza, zanemarujući zadnji nulti bajt. Na primjer,

char str = "123";

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

1.7. Funkcije za rad s memorijom.

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

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

traži prvo pojavljivanje znaka navedenog sa c u n bajtova niza str.

int memcmp (konst void *str1, konst void *str2, veličina_t n);

uspoređuje prvih n bajtova stringova str1 i str2.

void* memcpy (konst void *str1, konst void *str2, veličina_t n);

kopira prvih n bajtova iz niza str1 u niz str2.

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

kopira prvih n bajtova iz str1 u str2, osiguravajući da se preklapajućim nizovima ispravno rukuje.

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

kopira znak naveden sa c u prvih n bajtova str.

Oznake: C linije. Niz znakova.

Žice u C. Uvod.

Ovo je uvodni članak o C nizovima. Detaljniji opis i primjeri doći će kad naučimo raditi s memorijom i pokazivačima. U računalu su sve vrijednosti pohranjene kao brojevi. I linije također, tamo nema simbola ni slova. Pojam je niz brojeva. Svaki broj odgovara određenom znaku koji je preuzet iz tablice kodiranja. Kada se prikaže na ekranu, simbol se prikazuje na određeni način.
Nizovi tipa char koriste se za pohranu stringova. Ponavljam još jednom - tip char je numerički, pohranjuje jedan bajt podataka. Ali prema tablici kodiranja, svaki od ovih brojeva povezan je sa znakom. I u suprotnom smjeru - svaki znak je određen svojim serijskim brojem u tablici kodiranja.
Na primjer

#uključi #uključi 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(" prikaži kao char %c\n", i); printf("prikaži kao char %d\n", i); getch(); )

Napravili smo dvije varijable, jednu tipa char, ostalo int. Slovo "A" ima numeričku vrijednost 65. To je slovo, a ne niz, te je stoga okruženo jednostrukim navodnicima. Možemo ga ispisati kao pismo

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

Tada će biti izlaz
A
Ako ga ispišete kao broj, bit će
65
Isto možete učiniti s brojem 65, koji je pohranjen u varijabli like int.
Posebni znakovi također imaju svoj broj

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

Ovdje će se prvo "izvesti" zvučni signal, zatim njegova brojčana vrijednost, a zatim ponovno zvučni signal.
String u C-u je niz tipa char, čiji posljednji element pohranjuje terminalni znak "\0". Numerička vrijednost ovog znaka je 0, pa možemo reći da niz završava nulom.
Na primjer

#uključi #uključi void main() ( char riječ; riječ = "A"; riječ = "B"; riječ = "C"; riječ = "\0"; //riječ = 0; ekvivalentno printf("%s", riječ) ; getch(); )

Ključ %s korišten je za izlaz. U ovom slučaju, redak se ispisuje do prvog terminalnog znaka, jer funkcija printf ne zna veličinu niza riječi.
Ako u ovom primjeru ne stavite

Riječ = "\0";

tada će biti ispisan niz znakova proizvoljne duljine sve dok se ne naiđe na prvi bajt ispunjen nulama.

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

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

Čitanje redaka

Kako biste zatražili niz od korisnika, morate stvoriti međuspremnik. Veličina međuspremnika mora biti odabrana unaprijed tako da unesena riječ stane u njega. Kod čitanja redaka postoji opasnost da korisnik unese više podataka nego što međuspremnik dopušta. Ovi će podaci biti pročitani i smješteni u memoriju te će prebrisati vrijednosti drugih ljudi. Na taj način možete izvršiti napad snimanjem potrebnih bajtova, u kojima, na primjer, vrijedi ići na dio koda sa zloćudnim programom, ili zapisom podataka.

#uključi #uključi void main() ( char buffer; scanf("%19s", buffer); printf("%s", buffer); getch(); )

U ovom slučaju, broj unesenih znakova je ograničen na 19, a veličina međuspremnika je 1 veća, jer je potrebno pohraniti terminalni znak. Napišimo jednostavan program koji od korisnika traži niz i vraća njegovu duljinu.

#uključi #uključi void main() ( char buffer; unsigned len = 0; scanf("%127s", buffer); while (buffer != "\0") ( len++; ) printf("length(%s) == %d" , međuspremnik, len); getch(); )

Budući da je numerička vrijednost znaka "\0" nula, možemo pisati

Dok je (međuspremnik != 0) ( len++; )

Ili, još kraće

Dok (međuspremnik) ( len++; )

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

#uključi #uključi /* Rezultat usporedbe bit će broj 0 ako su riječi jednake 1 ako je prva riječ veća od druge u leksikografskom poretku -1 ako je druga riječ veća */ void main() ( char firstWord; / /Prva riječ char secondWord; //Druga riječ bez predznaka i; / /Brojač int cmpResult = 0; //Rezultat usporedbe scanf("%127s", firstWord); 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 //onda završava s nulom cmpResult = 1; break; ) else if (firstWord[i]< secondWord[i]) { cmpResult = -1; break; } } printf("%d", cmpResult); getch(); }

Budući da svako slovo ima numeričku vrijednost, mogu se međusobno usporediti kao brojevi. Osim toga, obično (ali ne uvijek!) slova u tablicama kodiranja su poredana abecednim redom. Stoga će sortiranje prema numeričkoj vrijednosti također biti sortiranje po abecedi.

C i C++ biblioteka funkcija uključuje bogat skup funkcija za obradu nizova i znakova. Funkcije nizova rade na nizovima znakova koji završavaju nultim znakovima. U jeziku C, da biste koristili funkcije niza, morate uključiti datoteku zaglavlja na početku programskog modula , a za simboličke - datoteku zaglavlja . C++ koristi zaglavlja za rad s funkcijama nizova i znakova I odnosno. Ovo poglavlje koristi nazive C-zaglavlja radi lakše prezentacije.

Budući da jezici C i C++ ne kontroliraju automatski kršenje svojih granica prilikom izvođenja operacija s nizovima, sva odgovornost za prelijevanje nizova pada na ramena programera. Zanemarivanje ovih suptilnosti može dovesti do pada programa.

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

Povijesno gledano, argumenti karakternih funkcija bile su cjelobrojne vrijednosti, od kojih se koristio samo niži bajt. Znakovne funkcije automatski pretvaraju svoje argumente u unsigned char. Naravno, možete slobodno pozvati te funkcije sa znakovnim argumentima, budući da se znakovi automatski podižu na rang cijelih brojeva kada se funkcija pozove.

U naslovu definiran je tip size_t koji je rezultat primjene operatora sizeof i tip je nepredznačenog cijelog broja.

C99 je dodao kvalifikator ograničenja nekim parametrima nekoliko funkcija izvorno definiranih u C89. Prilikom pregleda svake takve funkcije bit će naveden njezin prototip koji se koristi u C89 okruženju (kao iu C++ okruženju), au opisu ove funkcije bit će navedeni parametri s atributom restrict.

Popis funkcija

Provjerite pripadnost

isalnum - Provjera je li znak alfanumerički
isalpha - Provjera pripada li simbol slovima
isblank - Provjerite prazan znak
iscntrl - Provjerava da li simbol pripada kontrolnim simbolima
isdigit - Provjera je li znak digitalan
isgraph - Provjerava može li se ispisati znak, ali ne i razmak
islower - Provjerava je li znak mali
isprint - Provjerava da li se znak može ispisati
ispunct - Provjera pripada li simbol interpunkcijskim znakovima
isspace - Provjerava je li znak razmak
isupper - Provjerava da li je znak veliko slovo
isxdigit - Provjerava je li znak heksadecimalni

Rad s nizovima znakova

memchr - Pretražuje niz kako bi pronašao prvo pojavljivanje znaka
memcmp - Uspoređuje određeni broj znakova u dva niza
memcpy - Kopira znakove iz jednog niza u drugi
memmove - Kopira znakove iz jednog niza u drugi, uzimajući u obzir preklapanje nizova
memset - Ispunjava određeni broj znakova u nizu zadanim brojem

Manipulacija žicama

strcat - Dodaje kopiju jednog niza zadanom nizu
strchr - Vraća pokazivač na prvo pojavljivanje nižeg bajta zadanog parametra
strcmp - Uspoređuje dva niza u leksikografskom redu
strcoll - Uspoređuje jedan niz s drugim prema parametru setlocale
strcpy - Kopira sadržaj jednog niza u drugi
strcspn - Vraća niz koji ne sadrži navedene znakove
strerror - Vraća pokazivač na niz koji sadrži poruku o pogrešci sustava
strlen - Vraća duljinu niza završenu nulom

Nisam slučajno stavio temu o stringovima u odjeljak "Nizovi". Budući da je string u biti niz znakova. Evo primjera:

char str = "Ovo je samo niz";

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

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

Oni. još uvijek isti niz, samo se sastoji od znakova. Stoga s njim možete raditi, baš kao i s nizovima cijelih brojeva.

Sada pokušajmo rad s nizovima u c. U uvodnim lekcijama naučili smo da simboli pripadaju cjelobrojnim tipovima, tj. svaki znak ima svoju numeričku vrijednost. Evo primjera i njegovog rješenja:

  1. unesenu riječ trebate pretvoriti u velika slova:
  2. #uključi
    #uključi

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

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

    Povratak 0;
    }

    Da biste dobili kod broja, jednostavno upotrijebite specifikator %d u funkciji printf. Da, i još jedna važna točka: kraj bilo kojeg linije je nulti terminator, koji je označen posebnim znakom - "\0".

Drugi način za specificiranje niza je da ga deklarirate pomoću char*. Evo primjera:

char *str = "žica";

Oni. kreira se pokazivač na niz i nalazi se negdje u memoriji.

A evo kako možete unijeti stringove preko operatora scanf, koji nam je već poznat:

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

Ovdje postoje dvije suptilnosti:

  1. znak za uzimanje adrese ovdje nije potreban, budući da je ime niza, kao što već znamo, adresa
  2. Duljina ulaznog niza ne smije premašiti 15 znakova, budući da posljednji mora biti nulti terminator. Štoviše, sam prevodilac će popuniti ovaj simbol nakon zadnjeg unesenog simbola.

Budući da je jezik C strukturni jezik, već postoje ugrađene funkcije za rad sa žicama i sa simbolima. Za obradu nizova morat ćete uključiti datoteku: ctype.h. Datoteka sadrži funkcije za određivanje formata velikih i malih slova i znakova. Uglavnom, sve što trebate znati o karakteru može se učiniti pomoću funkcija u datoteci ctype.h

Ponekad ćete možda trebati pretvoriti niz u drugu vrstu podataka. Za pretvaranje stringova u druge vrste, postoji biblioteka stdlib. Evo njegovih funkcija:

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

Ponekad su te funkcije vrlo korisne, na primjer, kada trebate izdvojiti godinu ili digitalnu vrijednost iz niza. Rad sa stringovima u c (si) je vrlo važna tema, stoga pokušajte razumjeti ovu lekciju.

Zadnja izmjena: 31.10.2015

Ulančavanje

Ulančavanje ili spajanje nizova može se izvršiti pomoću operatora + ili metode Concat:

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

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

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

String s5 = "jabuka"; niz s6 = "dan"; niz s7 = "čuva"; string s8 = "liječnik"; niz s9 = "odsutan"; vrijednosti niza = novi niz (s5, s6, s7, s8, s9); String s10 = String.Join(" ", vrijednosti); // rezultat: string "jabuka na dan tjera doktora podalje"

Metoda Join je također statična. Verzija gore korištene metode uzima dva parametra: niz znakova za razdvajanje (u ovom slučaju razmak) i niz znakova koji će biti spojeni i odvojeni pomoću znaka za razdvajanje.

Usporedba nizova

Za usporedbu nizova upotrijebite statičku metodu usporedbe:

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

Ova verzija metode Usporedi uzima dva niza i vraća broj. Ako je prvi niz abecedno viši od drugog, vraća se broj manji od nule. Inače se vraća broj veći od nule. I treći slučaj - ako su nizovi jednaki, vraća se broj 0.

U ovom slučaju, budući da je znak h abecedno viši od znaka w, prvi red će biti viši.

Traži u nizu

Pomoću metode IndexOf možemo odrediti indeks prvog pojavljivanja jednog znaka ili podniza u nizu:

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

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

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

String path = @"C:\SomeDir"; string datoteke = Imenik.GetFiles(put); 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 podnizova. Funkcija Split uzima niz znakova ili nizova kao parametar koji će služiti kao graničnici. Na primjer, izbrojimo broj riječi u pojmu tako da ga podijelimo s razmacima:

String text = "I zato se sve dogodilo"; string words = text.Split(new char ( " " )); foreach (string s u riječima) ( Console.WriteLine(s); )

Ovo nije najbolji način dijeljenja razmacima, budući da bismo mogli imati nekoliko uzastopnih razmaka u ulaznom nizu, a rezultirajući niz bi također sadržavao razmake, pa je bolje koristiti drugu verziju metode:

String words = text.Split(new char ( " "), StringSplitOptions.RemoveEmptyEntries);

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

Obrezivanje linije

Za rezanje znakova na početku ili na kraju koristite funkciju Trim:

Tekst niza = "zdravo svijetu"; tekst = tekst.Trim(); // rezultat "zdravo svijetu" text = text.Trim(new char ( "d", "h" )); // rezultat "hello world"

Funkcija Trim, bez parametara, skraćuje razmake na početku i na kraju i vraća skraćeni niz. Da bismo eksplicitno odredili koji znakovi na početku i na kraju trebaju biti odrezani, možemo proslijediti niz tih znakova u funkciju.

Ova funkcija ima djelomične analoge: funkcija TrimStart skraćuje početne znakove, a funkcija TrimEnd krajnje znakove.

Funkcija Substring omogućuje vam rezanje određenog dijela niza:

String text = "Dobar dan"; // odrezano počevši od trećeg znaka text = text.Substring(2); // rezultat "dobar dan" Console.WriteLine(text); // rezanje prvo na zadnja dva znaka text = text.Substring(0, text.Length - 2); // rezultat "roshy de" Console.WriteLine(text);

Funkcija Substring također vraća skraćeni niz. Prva korištena inačica koristi indeks kao parametar, počevši od kojeg treba skraćivati ​​niz. Druga verzija koristi dva parametra - indeks početka podrezivanja i duljinu odrezanog dijela strune.

Umetnuti

Da biste umetnuli jedan red u drugi, upotrijebite funkciju Umetni:

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

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

Uklanjanje redaka

Metoda Ukloni pomaže ukloniti dio niza:

String text = "Dobar dan"; // indeks zadnjeg znaka int ind = text.Length - 1; // izrezivanje zadnjeg znaka text = text.Remove(ind); Console.WriteLine(text); // izreži prva dva znaka text = text.Remove(0, 2);

Prva verzija metode Remove uzima indeks u nizu, počevši od kojeg treba ukloniti sve znakove. Druga verzija uzima još jedan parametar - koliko znakova treba ukloniti.

Zamjena

Za zamjenu jednog znaka ili podniza drugim koristite metodu Zamijeni:

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

U drugom slučaju korištenja funkcije Replace, niz od jednog znaka "o" zamjenjuje se praznim nizom, odnosno zapravo se uklanja iz teksta. Ova metoda olakšava brisanje određenog teksta u recima.

Promjena velikih i malih slova

Za pretvaranje niza u velika i mala slova koristite funkcije ToUpper() i ToLower():

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

Najbolji članci na temu