Deklarácie reťazcov

Reťazec v jazyku C je jednorozmerné pole znakov, ktorého posledným prvkom je znak konca riadku – nula (reťazec ukončený nulou, teda reťazec ukončený NULL).

Ad typ premennej Reťazec v C je možný tromi spôsobmi, z ktorých dva inicializujú reťazec v čase deklarácie.

Prvý spôsob:

Deklarácie poľa znakov (nezabudnite pridať medzeru pre ukončujúcu hodnotu null):

Značky;

Druhý spôsob:

Priraďte reťazcovej premennej počiatočnú hodnotu (v tomto prípade môže kompilátor vypočítať dĺžku samotného reťazca):

Char s = "Príklad inicializácie reťazca";

Napravo od priraďovacieho znaku je reťazcová konštanta. Na koniec reťazca sa automaticky pridá nula ('\0'). Konštanty znakového reťazca sú umiestnené v triede statického úložiska.

Tretí spôsob:

Implicitná indikácia, že sa používa pole. Na ľavej strane priraďovacieho znaku je uvedený ukazovateľ na symbol:

Char *s="Druhá možnosť inicializácie";

Premenná s bude ukazovateľom na toto miesto Náhodný vstup do pamäťe, kde sa nachádza reťazcová konštanta. Táto forma zápisu má potenciálnu chybu v tom, že ukazovateľ na znak sa často označuje ako reťazec. Záznam nižšie je len ukazovateľ na znak, pretože pre reťazec nie je medzera:

Char*s;

Zadanie reťazca zo štandardného vstupného zariadenia (klávesnice)

Existuje sada funkcií pre prácu s reťazcami. Pre vstup zo štandardného vstupného zariadenia (klávesnice) sa najčastejšie používajú knižničné funkcie zo štandardného vstupno/výstupného modulu: scanf a dostane.

Ak chcete zadať reťazec pomocou funkcie scanf, používa formát « %s» a všimnite si, že znak adresy sa nepoužíva pred identifikátorom riadka « & » , pretože jednorozmerné pole je už reprezentované ukazovateľom na jeho začiatok:

scanf("%s", s);

Funkcia dostane()číta znaky, kým nedosiahne znak nového riadku. Funkcia akceptuje všetky znaky až po znak nového riadku, ale bez neho. Na koniec reťazca sa pridá koncová nula ('\0'). Funkcia dostane() vloží sekvenciu znakov načítaných z klávesnice do parametra reťazca a vráti ukazovateľ na tento reťazec (ak bola operácia úspešná) alebo NULL (v prípade chyby). V nižšie uvedenom príklade sa po úspešnom dokončení operácie na obrazovke zobrazia dva rovnaké riadky:

#include int main() ( char s; char *p; p=gets(s); printf(" \n Zadaný reťazec %s. ",s); if (p) printf(" \n Zadaný reťazec %s. ", p); vrátiť 0; )

Mimochodom, poznamenávame, že funkcia get sa často používa na zadanie akýchkoľvek údajov z klávesnice ako reťazca za účelom ďalšej konverzie pomocou funkcie sscanf na požadovaný formát alebo na predbežnú analýzu vstupných údajov, napríklad:

#include #include #include int main() ( char s; int x, chyba; do ( printf(" \n Zadajte celé číslo -> "); dostane(s); err=sscanf(s, "%d"&x); if (chyba !=1) printf(" \n Vstupná chyba. "); ) while (chyba!=1); printf("\n Zadané celé číslo -> %d", x); návrat 0; )

Tlač reťazcov na štandardný výstup (obrazovka monitora)

Na výstup reťazcov na štandardný výstup (obrazovka monitora) môžete použiť dve funkcie printf a kladie. Vo funkcii printf sa ako formát odovzdá "%s". Pohodlie používania tejto funkcie spočíva v tom, že okrem reťazca môžete okamžite zobraziť aj údaje iného typu. funkcia kladie je, že po výstupe riadku automaticky nastane prechod na ďalší riadok.

Funkcie reťazcov

Na konverziu reťazcov v jazyku C je k dispozícii knižnica reťazcov. Každá z funkcií má svoj vlastný formát záznamu (prototyp).

Najpoužívanejšie funkcie sú popísané v tomto článku. - čítať

Príklad programov (listing) pracujúcich s reťazcami

Moderný štandard C++ definuje triedu s funkciami a vlastnosťami (premennými) na organizáciu práce s reťazcami (v klasickom jazyku C neexistujú reťazce ako také, existujú iba polia znakov):

#include

#include

#include

Ak chcete pracovať s reťazcami, musíte tiež zahrnúť štandardný priestor názvov:

Použitie menného priestoru std;

V opačnom prípade budete musieť všade zadať deskriptor triedy std::string namiesto reťazca.

Nasleduje príklad programu, ktorý pracuje s reťazcom (nefunguje v starých kompilátoroch kompatibilných s C!):

#include #include #include pomocou menného priestoru std; int main() (reťazec s = "Test"; s.insert(1,"!"); cout<< s.c_str() << endl; string *s2 = new string("Hello"); s2->erase(s2->end()); cout<< s2->c_str(); cin.get(); návrat 0; )

Hlavné vlastnosti, ktoré má trieda string:

  • inicializácia s poľom znakov (reťazec vstavaného typu) alebo iným objektom typ reťazca. Vstavaný typ nemá druhú schopnosť;
  • kopírovanie jedného riadku do druhého. Pre vstavaný typ musíte použiť funkciu strcpy();
  • prístup k jednotlivým znakom reťazca na čítanie a zápis. Vo vstavanom poli sa to robí pomocou operácie indexu alebo nepriameho adresovania pomocou ukazovateľa;
  • porovnávanie dvoch reťazcov pre rovnosť. Pre vstavaný typ sa používajú funkcie rodiny strcmp();
  • zreťazenie (reťazenie) dvoch reťazcov, pričom výsledok dáva buď ako tretí reťazec, alebo namiesto jedného z pôvodných. Pre vstavaný typ sa však na získanie výsledku používa funkcia strcat(). Nový riadok, musíte postupne použiť funkcie strcpy() a strcat() a tiež sa postarať o alokáciu pamäte;
  • vstavané prostriedky na určenie dĺžky reťazca (členské funkcie triedy size() a l ength()). Jediným spôsobom, ako zistiť dĺžku reťazca vstavaného typu, je jeho výpočet pomocou funkcie strlen();
  • schopnosť zistiť, či je reťazec prázdny.

Zvážte tieto základné schopnosti detailne.

Inicializácia reťazca pri opise a dĺžka šnúrky(bez koncového null terminátora):

String st("Môj reťazec\n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";

Reťazec môže byť aj prázdny:

Reťazec st2;

Ak chcete skontrolovať, či je reťazec prázdny, jeho dĺžku môžete porovnať s 0:

if (!st.size()) // prázdne

alebo použite metódu empty(), ktorá vráti hodnotu true pre prázdny reťazec a hodnotu false pre neprázdny reťazec:

if (st.empty()) // prázdne

Tretia forma vytvorenia reťazca inicializuje objekt typu string s iným objektom rovnakého typu:

Reťazec st3(st);

Reťazec st3 je inicializovaný reťazcom st . Ako sa môžeme uistiť, že tieto struny sa zhodujú? Použime operátor porovnávania (==):

Ak (st == st3) // inicializácia bola úspešná

Ako kopírovať jeden riadok do druhého? S obvyklým operátorom priradenia:

st2 = st3; // skopírujte st3 do st2

Pre reťazenie reťazcov používa sa operátor sčítania (+) alebo operátor priradenia sčítania (+=). Nech sú uvedené dva riadky:

String s1("ahoj, "); string s2("svet\n");

Môžeme získať tretí reťazec pozostávajúci zo zreťazenia prvých dvoch, teda:

Reťazec s3 = s1 + s2;

Ak chceme pridať s2 na koniec s1 , musíme napísať:

S1 + = s2;

Operácia sčítania môže zreťaziť objekty triedy reťazec nielen medzi sebou, ale aj so strunami vstavaného typu. Vyššie uvedený príklad môžete prepísať tak, že špeciálne znaky a interpunkčné znamienka budú reprezentované vstavaným typom char * a významné slová budú reprezentované objektmi triedy string:

Const char *pc = ","; string s1("ahoj"); reťazec s2("svet"); reťazec s3 = s1 + pc + s2 + "\n"; cout<< endl << s3;

Takéto výrazy fungujú, pretože kompilátor „vie“, ako automaticky konvertovať objekty vstavaného typu na objekty triedy string . K objektu typu string je tiež možné jednoducho priradiť vstavaný reťazec:

Reťazec s1; const char *pc = "pole znakov"; s1=pc; // správny

Opačná transformácia je nefunguje. Pokus o vykonanie nasledujúcej vstavanej inicializácie reťazca typu spôsobí chybu kompilácie:

Char*str = s1; // chyba kompilácie

Ak chcete vykonať túto konverziu, musíte explicitne zavolať členskú funkciu s názvom c_str() ("reťazec C"):

Const char *str = s1.c_str();

Funkcia c_str() vracia ukazovateľ na pole znakov obsahujúce reťazec objektu typu string, ako by to bolo v zabudovanom type reťazca. Kľúčové slovo const tu zabraňuje „nebezpečnej“ možnosti v moderných vizuálnych prostrediach priamo upravovať obsah objektu prostredníctvom ukazovateľa.

Komu jednotlivé postavy k objektu typu string , podobne ako k vstavanému typu, je možné pristupovať pomocou operácie indexu. Tu je napríklad útržok kódu, ktorý nahrádza všetky bodky podčiarkovníkmi:

String str("www.disney.com"); int size = str.size(); pre (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;

Replace(str.begin(), str.end(), ".", "_");

Je pravda, že sa tu nepoužíva metóda nahradzovania triedy reťazcov, ale algoritmus s rovnakým názvom:

#include

Keďže objekt typu string sa správa ako kontajner, možno naň použiť iné algoritmy. To vám umožňuje riešiť problémy, ktoré nie sú priamo riešené funkciami triedy string.

Nižšie je uvedený stručný popis hlavných operátorov a funkcií triedy reťazcov, odkazy v tabuľke vedú k popisom v ruskom jazyku na internete. Kompletnejší zoznam schopností triedy string nájdete napríklad na Wikipedii alebo cplusplus.com.

Určenie znakov v reťazci

operátor=

priraďuje hodnoty k reťazcu

priradiť

priraďuje znaky k reťazcu

Prístup k jednotlivým postavám

pri

získanie zadaného znaku s kontrolou indexu mimo hraníc

operátor

získanie zadaného znaku

vpredu

získanie prvej postavy

späť

získanie posledného znaku

údajov

vráti ukazovateľ na prvý znak reťazca

c_str

sa vracia nemodifikovateľné Pole znakov C obsahujúce znaky reťazca

Kontrola kapacity reťazca

prázdny

skontroluje, či je reťazec prázdny

veľkosť
dĺžka

vráti počet znakov v reťazci

max_size

vráti maximálny počet znakov

rezerva

rezervuje úložný priestor

Operácie na reťazci

jasný

vymaže obsah reťazca

vložiť

vkladanie znakov

vymazať

odstránenie postavy

push_back

pridanie znaku na koniec reťazca

pop_back

odstráni posledný znak

priložiť

operátor+=

pridáva znaky na koniec reťazca

porovnať

porovnáva dva reťazce

nahradiť

nahradí každý výskyt zadaného znaku

podstr

vráti podreťazec

kopírovať

kopíruje znaky

zmeniť veľkosť

zmení počet uložených znakov

»Dôveryhodná SEO agentúra v Indii môže zvýšiť príjmy malých podnikov

80 % používateľov pred nákupom vyhľadáva na Google a iných vyhľadávačoch a viac ako 50 % dopytov generovaných prostredníctvom vyhľadávačov sa konvertuje. Tieto dve štatistiky dokazujú dôležitosť optimalizácie pre vyhľadávače. Existuje mnoho takýchto štatistík a faktov, ktoré jasne ukazujú: akýkoľvek malý, stredný alebo veľký podnik potrebuje profesionálne SEO služby. Malé podniky a začínajúce podniky často čelia problémom s rozpočtom. Môžu využiť pomoc akejkoľvek dôveryhodnej SEO agentúry z Indie, aby získali najlepšiu službu SEO vo svojom rozpočte, aby zvýšili svoje príjmy.
Vyhľadávanie má veľký vplyv na mysle spotrebiteľov. Podľa rôznych štatistík zdieľaných hlavnými odborníkmi na optimalizáciu pre vyhľadávače na rôznych autorizovaných webových stránkach, ako sú Search Engine Land, Moz, SEO Journal, Digital Marketers India, Hubspot atď. SEO zachytáva väčšinu potenciálnych zákazníkov. Okrem toho potenciálni zákazníci pochádzajúci z výsledkov organického vyhľadávania majú vyššiu mieru konverzie. Tieto štatistiky a správanie spotrebiteľov jasnejšie poukazujú na to, že najlepšia služba SEO nie je luxus, ale nevyhnutnosť pre každé podnikanie.
Aby každá organizácia obišla konkurenciu a zvýšila obchodný rast, musí využívať služby optimalizácie pre vyhľadávače. Veľké značky môžu investovať dostatok peňazí do expertnej SEO služby, ktorú ponúka špičková SEO firma alebo SEO špecialista, no majitelia malých firiem často robia kompromisy v kvalite tejto služby kvôli menšiemu rozpočtu. Je ťažkou skutočnosťou, že malé podniky a začínajúce podniky opúšťajú príležitosti, ktoré sa dajú vytvoriť pomocou profesionálnej služby SEO, alebo využívajú lacnú službu SEO, ktorá neprináša žiadne pozitívne výsledky.
Majitelia malých podnikov a začínajúci podnikatelia môžu využívať výhody profesionálnych SEO služieb aj pri obmedzenom rozpočte. Najlepším riešením je nájsť dôveryhodnú SEO spoločnosť so sídlom v Indii. V Indii je veľa SEO expertov, ktorí spolupracujú s agentúrou pre digitálny marketing a ponúkajú najlepšie služby v tomto odvetví. Môžu vám poskytnúť požadované SEO služby vo vašom rozpočte. Mzdy je možné dohodnúť s indickou SEO agentúrou, aby ste získali lepšie služby za nižšie ceny. Nepodliehajte však lacnej službe SEO, ktorá účtuje menej, a sľubujte, že dáte viac, pretože odborné znalosti prichádzajú na svoje vlastné náklady. Pred uzavretím zmluvy so spoločnosťou pre vaše podnikanie musíte vidieť portfólio alebo položiť správne otázky.
SEO experti v Indii majú skúsenosti s najlepšími postupmi optimalizácie pre vyhľadávače. V Indii sú tiež niektorí špecialisti na SEO, ako napríklad Ash Vyas, ktorí sa špecializujú na vytváranie najlepšej stratégie optimalizácie pre vyhľadávače pre firmu s uvedeným rozpočtom. SEO profesionáli vytvoria jasný plán a podelia sa aj o očakávané výsledky. Takto si môžete byť dobre vedomí svojich investícií a výnosov. Pomáha to robiť lepšie obchodné rozhodnutia.
Dobrým nápadom je čo najskôr nájsť a uzavrieť zmluvu s dôveryhodnou SEO spoločnosťou z Indie, ktorá ponúka najlepšie SEO služby. Môžete tiež začať s malým rozpočtom a obmedzenými aktivitami, aby ste mohli začať indexovať svoje webové stránky a posilniť svoje kľúčové slová vo vyhľadávačoch. Nečakajte na ideálny čas alebo deň, kedy budete mať tisíce dolárov na investovanie do najlepších SEO služieb. Ak začnete včas, pomôže vám to dosiahnuť rýchlejšie výsledky, keď budete so svojím marketingovým prístupom agresívni. Dôveryhodná SEO spoločnosť so sídlom v Indii vám pomôže definovať vaše súčasné a budúce plány na dosiahnutie dobrých výsledkov. Viac indexovaných stránok zlepšilo hodnotenie a dôveryhodná značka vášho podnikania, ktorá sa vytvorí pomocou nepretržitých profesionálnych postupov SEO, zdvojnásobí dopyty, obchod a príjmy. Každá malá firma môže začať s dvojcifernou investíciou do profesionálnych SEO služieb. V Indii je veľa SEO agentúr, ktoré ponúkajú nízky rozpočet, ale sú výsledkom orientovaných služieb optimalizácie pre vyhľadávače.

prieskumy z exilu

  • CraigWew

    12.04.2018

    »Význam vytvorenia vzťahu so zákazníkom v oblasti nehnuteľností a všeobecného predaja

    Dôležitosť nadviazania vzťahu so zákazníkom.
    Nadviazanie vzťahu so zákazníkom si treba zaslúžiť a musí sa k nemu pristupovať ako k veľmi integrálnej súčasti procesu predaja.
    Aby ste prinútili zákazníka a seba, aby sa vzťahovali na skutočnej báze jeden k jednému, zahŕňa to dve veci!
    Najprv si to musíte uvedomiť a byť tam! Po druhé, musíte pochopiť, že počas tohto procesu nastanú dve rôzne fázy.
    A-Buď tam-čo to znamená?
    o Väčšina ľudí v skutočnosti nepočúva druhú osobu, keď hovorí. Vo všeobecnosti sú takí zaneprázdnení formulovaním svojej ďalšej odpovede alebo vyjadrenia, že ich ani nemôžu skutočne počúvať.
    o Ak to znie ako vy, byť tam znamená držať hubu a počúvať!
    B-Čo je prvá alebo počiatočná fáza?
    o Vo všeobecnosti máte len pár minút na to, aby ste sa v mysliach zákazníkov etablovali ako niekto, s kým chcú jednať.
    o Ak máte pochybnosti, je najlepšie najprv položiť otázky, ktoré ich vytiahnu a hovoriť o sebe.
    o Je tiež vždy bezpečné vystupovať ako profesionál – nemám na mysli stoického alebo suchého, ale niekoho, kto vie, čo robí, hovorí a vyzerá.
    C-Iné etapy
    o Ako čas plynie, prostredníctvom konverzácie a otázok, ktoré budú mať, buď preukážete svoje schopnosti, alebo nie.
    o Uvedomte si, že vás budú pravdepodobne chvíľu merať. Dobrou správou je, že v určitom okamihu, ak ste boli úspešní pri nadväzovaní vzťahu, sa uvoľnia a obaja sa môžete sústrediť na hľadanie alebo predaj domu.
    Čo mi ešte môže pomôcť rozvinúť vzťah?
    o Pokusom porozumieť rôznym typom osobnosti a potom hovorením a kladením správnych otázok.
    o Ak máte dobrý vzťah (dostanete sa na rovnakú vlnovú dĺžku ako zákazník), potom je predaj v podstate ukončený, teraz už len stačí nájsť ten správny domov alebo vyplniť zoznam.
    Čo sa týka rôznych osobností
    o Keďže toto nie je kniha o psychiatrii, pochopte zatiaľ len dva hlavné typy.
    o Existujú introvertní a extrovertní ľudia.
    o Poznáte typ. Zamyslite sa nad tromi ľuďmi, ktorých poznáte, ktorí zodpovedajú každej klasifikácii.
    A čo reč tela a rečové vzorce?
    o Ak hovoria rýchlo alebo pomaly, snažte sa napodobniť ich rečové vzorce.
    o Ak hovoria nahlas alebo potichu, urobte to isté. Nakláňajú sa dopredu alebo dozadu?
    o Netreba dodávať, že na túto tému je napísaných veľa kníh. Len si uvedomte, že je to dôležitý faktor – najmä keď sedíte v konferenčnej miestnosti alebo u niekoho doma a diskutujete o dohode v hodnote 400 000 dolárov.
    Rozvíjanie vzťahu je zručnosť, ktorú sa možno naučiť a zdokonaliť.
    o Všetci sme zažili predajcu, ktorý nám niečo predal, a napriek tomu sme nemali pocit, že nás predávajú. Dôvodom je, že sa vďaka nemu cítite pohodlne tam, kde ste im dôverovali.
    Ako rozvíjame vzťah?
    o Používajte oči a uši a pýtajte sa. vysvetliť
    o Použite oči:
    o Pozrite sa na ich šaty – ich auto – ich osobný majetok a myslím tým naozaj, pozrite sa na ne a rozlúštite, čo vám to o nich hovorí.
    o Použite uši:
    o Počúvajte, čo hovoria, a pýtajte sa, aby ste pochopili podstatu ich skutočnej MOTIVÁCIE!
    Teraz počas celého tohto rozhovoru pravdepodobne zistíte jednu alebo dve veci, ktoré s nimi máte spoločné. (Rodina, zemepisné oblasti, rybolov atď.) Keď narazíte na spoločnú reč, povedzte im, že sa poznáte, a potom si nájdite chvíľu na to, aby ste to s nimi prediskutovali.
    Čo je cieľom?
    o Keď vás prijmú ako jedného z nich, budete mať skutočne skvelé skúsenosti s predajom, pretože teraz spolupracujete a potom ako tím – už nie ste predajcom, teraz ste v pozícii poradcu .
    o Pamätajte, že zákazník vám umožní alebo nedovolí vstúpiť do jeho sveta. Ak to pochopíte a naozaj tvrdo pracujete na tom, aby ste sa k nemu/nej vcítili, môžete získať dôveru. Vo väčšine prípadov ich skutočne uvidíte relaxovať (reč tela), keď sa to stane, keď ste na ceste.
    o Na ilustráciu ste niekedy predniesli prejav a všimli ste si, že keď ste sa konečne spojili s členom publika, prikývli ste na súhlas. Všetky tieto veci sa môžu zdať banálne, ale nie sú.
    Na záver, ak si dokážete získať dôveru zákazníkov, predaj produktu alebo služby je oveľa jednoduchší a zážitok môže byť príjemný pre všetkých zúčastnených.
    Vždy si pamätajte, že výhra/výhra je najlepšia situácia.

Pozastavte AdBlock na tejto stránke.

Takže reťazce v jazyku C. Nemajú samostatný dátový typ, ako sa to robí v mnohých iných programovacích jazykoch. V jazyku C je reťazec pole znakov. Na označenie konca riadku sa používa znak „\0“, o ktorom sme hovorili v minulej časti tejto lekcie. Na obrazovke sa nijako nezobrazuje, takže pohľad naň nebude fungovať.

Vytvorenie a inicializácia reťazca

Keďže reťazec je pole znakov, deklarovanie a inicializácia reťazca je podobná podobným operáciám s jednorozmernými poľami.

Nasledujúci kód ilustruje rôzne spôsoby inicializácie reťazcov.

Výpis 1.

Charstr; char str1 = ("Y","o","n","g","C","o","d","e","r","\0"); char str2 = "Ahoj!"; char str3 = "Ahoj!";

Obr.1 Deklarácia a inicializácia reťazcov

V prvom riadku jednoducho deklarujeme pole desiatich znakov. Nie je to vlastne ani struna, lebo chýba mu nulový znak \0 , pokiaľ ide len o množinu znakov.

Druhý riadok. Najjednoduchší spôsob inicializácie v čele. Každý symbol deklarujeme samostatne. Hlavná vec je nezabudnúť pridať znak null \0.

Tretí riadok je podobný druhému riadku. Venujte pozornosť obrázku. Pretože v reťazci vpravo je menej znakov ako prvkov v poli, zostávajúce prvky budú vyplnené \0 .

Štvrtý riadok. Ako vidíte, veľkosť tu nie je nastavená. Program to automaticky vypočíta a vytvorí pole znakov požadovanej dĺžky. Týmto sa ako posledný vloží nulový znak \0.

Ako vypísať reťazec

Pridajme kód vyššie do plnohodnotného programu, ktorý vygenerované reťazce zobrazí na obrazovke.

Výpis 2.

#include int main(void) ( char str; char str1 = ("Y","o","n","g","C","o","d","e","r"," \0"); char str2 = "Dobrý deň!"; char str3 = "Dobrý deň!"; for(int i = 0; i< 10; i = i + 1) printf("%c\t",str[i]); printf("\n"); puts(str1); printf("%s\n",str2); puts(str3); return 0; }


Obr. 2 Rôzne spôsoby zobrazenia reťazca na obrazovke

Ako vidíte, existuje niekoľko základných spôsobov, ako zobraziť reťazec na obrazovke.

  • použite funkciu printf so špecifikátorom %s
  • použite funkciu puts
  • použite funkciu fputs, pričom ako druhý parameter uveďte stdout.

Jedinou výhradou sú funkcie puts a fputs. Všimnite si, že funkcia puts zalomí výstup na ďalší riadok, ale funkcia fputs nie.

Ako vidíte, výstup je pomerne jednoduchý.

Zadávanie reťazcov

So vstupom reťazca sú veci trochu komplikovanejšie ako s výstupom. Najjednoduchší spôsob by bol nasledujúci:

Výpis 3.

#include int main(void) ( char str; get(str); puts(str); return 0; )

Funkcia get pozastaví program, načíta reťazec znakov zadaných z klávesnice a umiestni ho do poľa znakov, ktorého názov sa odovzdá funkcii ako parameter.
Funkcia get končí znakom zodpovedajúcim klávesu enter a zapisuje sa do reťazca ako nulový znak.
Všimli ste si nebezpečenstvo? Ak nie, kompilátor vás na to láskavo upozorní. Je to preto, že funkcia get sa ukončí iba vtedy, keď používateľ stlačí kláves Enter. To je spojené so skutočnosťou, že v našom prípade môžeme ísť nad rámec poľa - ak je zadaných viac ako 20 znakov.
Mimochodom, skoršie chyby pretečenia vyrovnávacej pamäte boli považované za najbežnejší typ zraniteľnosti. Stále sa nachádzajú aj dnes, ale je oveľa ťažšie použiť ich na hackovanie programov.

Tak čo máme. Máme úlohu: napísať reťazec do poľa obmedzenej veľkosti. To znamená, že musíme nejakým spôsobom kontrolovať počet znakov zadaných používateľom. A tu prichádza na záchranu funkcia fgets:

Výpis 4.

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

Funkcia fgets berie ako vstup tri argumenty: premennú na zápis reťazca, veľkosť reťazca, ktorý sa má zapísať, a názov toku, odkiaľ získať údaje na zápis do reťazca, v tomto prípade stdin . Ako už viete z lekcie 3, stdin je štandardný vstupný tok, zvyčajne spojený s klávesnicou. Nie je nutné, aby dáta pochádzali zo stdin streamu, v budúcnosti túto funkciu využijeme aj na čítanie dát zo súborov.

Ak počas vykonávania tohto programu zadáme reťazec dlhší ako 10 znakov, iba 9 znakov od začiatku a znak zalomenia riadku sa ešte zapíše do poľa, fgets reťazec "ostrihá" na požadovanú dĺžku.

Všimnite si, že funkcia fgets nečíta 10 znakov, ale 9 ! Ako si pamätáme, v reťazcoch je posledný znak vyhradený pre znak null.

Poďme si to overiť. Spustíme program od posledného výpisu. A zadajte reťazec 1234567890. Na obrazovke sa zobrazí reťazec 123456789.


Obr.3 Príklad fungovania funkcie fgets

Vynára sa otázka. Kam zmizla desiata postava? A ja odpoviem. Nikam neodišla, zostala vo vstupnom toku. Spustite nasledujúci program.

Výpis 5.

#include int main(void) ( char str; fgets(str, 10, stdin); puts(str); int h = 99; printf("do %d\n", h); scanf("%d",&h) ; printf("po %d\n", h); návrat 0; )

Tu je výsledok jej práce.


Obr.4 Neprázdny stdin buffer

Dovoľte mi vysvetliť, čo sa stalo. Nazvali sme funkciu fgets. Otvorila vstupný prúd a čakala, kým zadáme údaje. Z klávesnice sme zadali 1234567890\n (\n znamená Enter ). Toto prešlo do vstupného toku stdin . Funkcia fgets podľa očakávania zobrala prvých 9 znakov 123456789 zo vstupného toku, pridala k nim nulový znak \0 a zapísala ho do reťazca str . Vo vstupnom streame zostáva ešte 0\n.

Ďalej deklarujeme premennú h . Jeho hodnotu zobrazíme na obrazovke. Potom zavoláme funkciu scanf. Tu sa očakáva, že môžeme niečo zadať, ale keďže 0\n visí vo vstupnom toku, potom to funkcia scanf vezme ako náš vstup a zapíše 0 do premennej h . Ďalej ho zobrazíme na obrazovke.

Toto, samozrejme, nie je práve správanie, ktoré očakávame. Na vyriešenie tohto problému je potrebné vyčistiť vstupnú vyrovnávaciu pamäť po tom, čo z nej načítame reťazec zadaný používateľom. K tomu použite špeciálnu funkciu fflush . Má len jeden parameter – stream, ktorý sa má vyčistiť.

Opravme posledný príklad, aby jeho fungovanie bolo predvídateľné.

Výpis 6.

#include int main(void) ( char str; fgets(str, 10, stdin); fflush(stdin); // vymazanie vstupného toku puts(str); int h = 99; printf("do %d\n", h) ; scanf("%d",&h); printf("po %d\n", h); return 0; )

Teraz bude program fungovať tak, ako má.


Obr.4 Prepláchnutie stdin vyrovnávacej pamäte pomocou funkcie fflush

Ak to zhrnieme, možno poznamenať dve skutočnosti. Prvý. V súčasnosti nie je bezpečné používať funkciu get, preto sa odporúča všade používať funkciu fgets.

Po druhé. Ak používate funkciu fgets, nezabudnite vymazať vstupnú vyrovnávaciu pamäť.

Týmto sa rozhovor o zadávaní reťazcov končí. Pohni sa.

Posledná aktualizácia: 31.10.2015

Reťazenie

Zreťazenie alebo zreťazenie reťazcov možno vykonať buď pomocou operátora +, alebo pomocou metódy Concat:

Reťazec s1 = "ahoj"; reťazec s2 = "svet"; reťazec s3 = s1 + " " + s2; // vysledok: string "hello world" string s4 = String.Concat(s3, "!!!"); // výsledok: string "ahoj svet!!!" Console WriteLine(s4);

Metóda Concat je statická metóda triedy String, ktorá berie ako parametre dva reťazce. Existujú aj iné verzie metódy, ktoré majú iný počet parametrov.

Metódu Join možno použiť aj na zreťazenie reťazcov:

Reťazec s5 = "jablko"; reťazec s6 = "deň"; reťazec s7 = "zachováva"; reťazec s8 = "lekár"; string s9 = "preč"; hodnoty reťazca = nový reťazec ( s5, s6, s7, s8, s9); String s10 = String.Join(" ", hodnoty); // výsledok: reťazec "jablko denne drží lekára preč"

Metóda Join je tiež statická. Verzia metódy použitej vyššie má dva parametre: reťazec oddeľovača (v tomto prípade medzeru) a pole reťazcov, ktoré budú spojené a oddelené oddeľovačom.

Porovnanie reťazcov

Ak chcete porovnať reťazce, použite statickú metódu Compare:

Reťazec s1 = "ahoj"; reťazec s2 = "svet"; int vysledok = String.Compare(s1, s2); ak (výsledok<0) { Console.WriteLine("Строка s1 перед строкой s2"); } else if (result >0) ( Console.WriteLine("Riadok s1 nasleduje po riadku s2"); ) else ( Console.WriteLine("Riadky s1 a s2 sú identické"); ) // výsledkom bude "Riadok s1 je pred riadkom s2"

Táto verzia metódy Compare trvá dva reťazce a vracia číslo. Ak je prvý reťazec abecedne vyšší ako druhý, vráti sa číslo menšie ako nula. V opačnom prípade sa vráti číslo väčšie ako nula. A tretí prípad - ak sú reťazce rovnaké, vráti sa číslo 0.

V tomto prípade, keďže znak h je abecedne vyšší ako znak w, prvý riadok bude tiež vyšší.

Vyhľadajte v reťazci

Pomocou metódy IndexOf môžeme určiť index prvého výskytu jedného znaku alebo podreťazca v reťazci:

Reťazec s1 = "ahoj svet"; char ch = "o"; int indexOfChar = s1.IndexOf(ch); // rovná sa 4 Console.WriteLine(indexOfChar); reťazec podreťazec = "bolo"; int indexOfSubstring = s1.IndexOf(subString); // rovná sa 6 Console.WriteLine(indexOfSubstring);

Podobne funguje aj metóda LastIndexOf, ktorá len nájde index posledného výskytu znaku alebo podreťazca v reťazci.

Ďalšia skupina metód umožňuje zistiť, či reťazec začína alebo končí určitým podreťazcom. Na to slúžia metódy StartsWith a EndsWith. Napríklad máme za úlohu odstrániť všetky súbory s príponou .exe z priečinka:

Cesta k reťazcu = @"C:\SomeDir"; string files = Directory.GetFiles(cesta); pre (int i = 0; i< files.Length; i++) { if(files[i].EndsWith(".exe")) File.Delete(files[i]); }

Rozdelenie čiary

Pomocou funkcie Split môžeme rozdeliť reťazec na pole podreťazcov. Ako parameter má funkcia Split pole znakov alebo reťazcov, ktoré budú slúžiť ako oddeľovače. Napríklad, spočítajme počet slov v termíne tak, že ho vydelíme medzerami:

Text reťazca = "A preto sa to všetko stalo"; string words = text.Split(new char ( " " )); foreach (reťazec s v slovách) ( Console.WriteLine(s); )

Toto nie je najlepší spôsob rozdelenia podľa medzier, pretože vo vstupnom reťazci by sme mohli mať niekoľko po sebe idúcich medzier a medzery by tiež spadli do konečného poľa, takže je lepšie použiť inú verziu metódy:

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

Druhý parameter StringSplitOptions.RemoveEmptyEntries hovorí, že sa majú odstrániť všetky prázdne podreťazce.

Orezanie šnúrky

Ak chcete orezať znaky na začiatku alebo na konci, použite funkciu Trim:

Text reťazca = "ahoj svet"; text = text. Trim(); // výsledok "hello world" text = text.Trim(new char ( "d", "h" )); // výsledok "ahoj svet"

Funkcia Trim bez parametrov orezáva medzery na začiatku a na konci a vracia orezaný reťazec. Ak chcete explicitne určiť, ktoré počiatočné a koncové znaky sa majú orezať, môžeme do funkcie odovzdať pole týchto znakov.

Táto funkcia má čiastočné analógie: funkcia TrimStart orezáva počiatočné znaky a funkcia TrimEnd orezáva koncové znaky.

Funkcia Substring vám umožňuje orezať konkrétnu časť reťazca:

Text reťazca = "Pekný deň"; // orezanie začínajúce od tretieho znaku text = text.Substring(2); // výsledok "pekný deň" Console.WriteLine(text); // najskôr orezať posledné dva znaky text = text.Substring(0, text.Length - 2); // výsledkom je "good de" Console.WriteLine(text);

Funkcia Substring tiež vráti orezaný reťazec. Prvá použitá verzia používa ako parameter index, z ktorého sa má orezať reťazec. Druhá verzia využíva dva parametre - index začiatku rezu a dĺžku odrezanej časti šnúrky.

Vložiť

Ak chcete vložiť jeden riadok do druhého, použite funkciu Vložiť:

Text reťazca = "Pekný deň"; string subString = "úžasné"; text = text.Insert(8, subString); Console.WriteLine(text);

Prvý parameter vo funkcii Insert je index, do ktorého sa má vložiť podreťazec, a druhý parameter je samotný podreťazec.

Odstraňovanie riadkov

Metóda Remove pomáha odstrániť časť reťazca:

Text reťazca = "Pekný deň"; // index posledného znaku int ind = text.Length - 1; // vystrihnutie posledného znaku text = text.Remove(ind); Console.WriteLine(text); // vystrihnutie prvých dvoch znakov text = text.Remove(0, 2);

Prvá verzia metódy Remove má v reťazci index, z ktorého sa odstránia všetky znaky. Druhá verzia má ešte jeden parameter - koľko znakov sa má odstrániť.

Výmena

Ak chcete nahradiť jeden znak alebo podreťazec iným, použite metódu Nahradiť:

Text reťazca = "pekný deň"; text = text.Replace("dobre", "zle"); Console.WriteLine(text); text = text.Replace("o", ""); Console.WriteLine(text);

V druhom prípade použitia funkcie Nahradiť sa reťazec jedného znaku „o“ nahradí prázdnym reťazcom, čiže sa vlastne z textu odstráni. Podobným spôsobom je jednoduché vymazať určitý konkrétny text v riadkoch.

Zmena prípadu

Na konverziu reťazca na veľké a malé písmená sa používajú funkcie ToUpper() a ToLower():

Reťazec ahoj = "Ahoj svet!"; Console.WriteLine(hello.ToLower()); // ahoj svet! Console.WriteLine(hello.ToUpper()); // AHOJ SVET!