34

--- Sprievodca C# --- Struny

Z hľadiska bežného programovania reťazec reťazcový dátový typ je jedným z najdôležitejších v C#. Tento typ definuje a podporuje reťazce znakov. V mnohých iných programovacích jazykoch je reťazec súborom znakov. A v C# sú reťazce objekty. Preto je typ reťazca jedným z referenčných typov.

Radová konštrukcia

Najjednoduchší spôsob, ako vytvoriť reťazec znakov, je použiť reťazcový literál. Napríklad v nasledujúcom riadku kódu je reťazcovej referenčnej premennej str priradený odkaz na reťazcový literál:

String str = "Príklad reťazca";

V tomto prípade je premenná str inicializovaná sekvenciou znakov "Example String". Objekt typu string možno vytvoriť aj z poľa typu char. Napríklad:

Char chararray = ("e", "x", "a", "m", "p", "l", "e"); string str = novy retazec(chararray);

Po vytvorení objektu typu string ho možno použiť kdekoľvek, kde je potrebný reťazec citovaného textu.

Trvanie reťazca

Napodiv, obsah objektu typu string sa nedá upraviť. To znamená, že po vytvorení sekvencie znakov ju nemožno zmeniť. Toto obmedzenie však prispieva k efektívnejšej implementácii reťazcov znakov. Preto sa táto na prvý pohľad zjavná nevýhoda v skutočnosti mení na výhodu. Ak teda potrebujete reťazec ako variáciu existujúceho reťazca, potom by ste na tento účel mali vytvoriť nový reťazec obsahujúci všetky potrebné zmeny. A keďže nepoužité strunové predmety sa automaticky zbierajú do „smetí“, nemusíte sa báť ani osudu nepotrebných šnúrok.

Treba však zdôrazniť, že reťazcové referenčné premenné (teda objekty typu string) podliehajú zmenám, a preto môžu odkazovať na iný objekt. Ale samotný obsah objektu typu string sa po jeho vytvorení nemení.

Zvážte príklad:

Statické void addNewString() ( string s = "Toto je môj ťah"; s = "Toto je nový ťah"; )

Poďme skompilovať aplikáciu a výslednú zostavu načítať do utility ildasm.exe. Obrázok ukazuje kód CIL, ktorý sa vygeneruje pre metódu void addNewString():

Všimnite si viacnásobné volania operačného kódu ldstr (zaťaženie reťazca). Tento operačný kód ldstr v CIL spôsobí načítanie nového objektu reťazca do spravovanej haldy. Výsledkom je, že predchádzajúci objekt, ktorý obsahoval hodnotu „Toto je môj ťah“, bude nakoniec zozbieraný odpad.

Práca so strunami

V triede System.String poskytuje sa sada metód na určenie dĺžky znakových údajov, vyhľadávanie podreťazca v aktuálnom reťazci, konverziu znakov z veľké písmená ku dnu a naopak atď. Nabudúce sa na túto triedu pozrieme podrobnejšie.

Pole, indexer a vlastnosť triedy String

Trieda String má definované jedno pole:

Verejný statický reťazec len na čítanie Prázdny;

Pole Empty označuje prázdny reťazec, t.j. reťazec, ktorý neobsahuje znaky. Toto sa líši od prázdneho odkazu typu String, ktorý sa jednoducho vytvorí na neexistujúci objekt.

Okrem toho trieda String definuje jeden indexátor iba na čítanie:

Verejný znak tohto (získať; )

Tento indexer vám umožňuje získať znak na zadanom indexe. Indexovanie reťazcov, podobne ako polia, začína od nuly. Objekty typu String sú trvalé a nemenia sa, takže dáva zmysel, že trieda String podporuje indexátor iba na čítanie.

Nakoniec trieda String definuje jednu vlastnosť len na čítanie:

Public int Length ( get; )

Vlastnosť Length vracia počet znakov v reťazci. Nižšie uvedený príklad ukazuje použitie indexátora a vlastnosti Length:

pomocou systému; class Príklad ( static void Main() ( string str = "Jednoduchý reťazec"; // Získanie dĺžky reťazca a 6. znaku v reťazci pomocou indexátora Console.WriteLine("Dĺžka reťazca je (0), 6. znak je "(1)"" , str.Length, str); ) )

Operátory triedy reťazcov

Trieda String preťažuje nasledujúce dva operátory: == a !=. Operátor == sa používa na testovanie rovnosti dvoch reťazcov znakov. Keď sa operátor == použije na odkazy na objekt, zvyčajne skontroluje, či sa oba odkazy týkajú rovnakého objektu. A keď je operátor == aplikovaný na objektové referencie typu String, obsah samotných reťazcov sa porovnáva z hľadiska rovnosti. To isté platí pre operátor !=. Keď sa aplikuje na objektové referencie typu String, obsah samotných reťazcov sa porovnáva kvôli nerovnosti. Zároveň ostatné relačné operátory, vrátane =, porovnávajú odkazy na objekty typu String rovnakým spôsobom ako na objekty iných typov. A aby ste skontrolovali, či je jeden reťazec väčší ako druhý, mali by ste zavolať metódu Compare() definovanú v triede String.

Ako bude zrejmé neskôr, mnohé druhy porovnávania reťazcov znakov využívajú kultúrne informácie. To však neplatí pre operátory == a !=. Koniec koncov, jednoducho porovnávajú poradové hodnoty znakov v reťazcoch. (Inými slovami, porovnávajú hodnoty binárnych znakov, ktoré neboli modifikované kultúrnymi normami, tj miestnymi nastaveniami.) Preto tieto operátory vykonávajú porovnávanie reťazcov bez ohľadu na veľkosť písmen a kultúru.

Metódy tried reťazcov

Nasledujúca tabuľka uvádza niektoré zo zaujímavejších metód tejto triedy, zoskupené podľa účelu:

Strunové metódy
Metóda Štruktúra a preťažené verzie Účel
Porovnanie reťazcov
Porovnať () public static int Porovnať(reťazec strA, reťazec strB)

Public static int Compare(reťazec strA, reťazec strB, bool ignoreCase)

Public static int Compare(reťazec strA, reťazec strB, StringComparison CompareType)

Public static int Compare(reťazec strA, reťazec strB, bool ignoreCase, kultúra CultureInfo)

Statická metóda, porovnáva reťazec strA s reťazcom strB. Vráti kladnú hodnotu, ak je strA väčšie ako strB; záporné, ak strA je menšie ako strB; a nula, ak sú reťazce strA a strB rovnaké. Pri porovnaní sa rozlišujú malé a veľké písmená a kultúrne citlivé.

Ak parameter ignoreCase trvá boolovská hodnota pravda, porovnanie nezohľadňuje rozdiely medzi veľkými a malými písmenami. V opačnom prípade sa tieto rozdiely berú do úvahy.

Parameter CompareType určuje špecifický spôsob, akým sa reťazce porovnávajú. Trieda CultureInfo je definovaná v priestore názvov System.Globalization.

public static int Porovnať(reťazec strA, int indexA, reťazec strB, int indexB, dĺžka int)

Public static int Compare(reťazec strA, int indexA, reťazec strB, int indexB, dĺžka int, bool ignoreCase)

Verejné statické int Porovnanie(reťazec strA, int indexA, reťazec strB, int indexB, dĺžka int, typ porovnania reťazca)

Public static int Compare(reťazec strA, int indexA, reťazec strB, int indexB, dĺžka int, bool ignoreCase, kultúra CultureInfo)

Porovnáva časti strún strA a strB. Porovnanie začína prvkami reťazca strA a strB a zahŕňa počet znakov špecifikovaný parametrom dĺžky. Metóda vráti kladnú hodnotu, ak je časť strA väčšia ako časť strB; záporná hodnota, ak je časť strA menšia ako časť strB; a nula, ak sú porovnávané časti reťazcov strA a strB rovnaké. Pri porovnaní sa rozlišujú malé a veľké písmená a kultúrne citlivé.

porovnaťOrdinálne() public static int CompareOrdinal(reťazec strA, reťazec strB)

Verejný statický int CompareOrdinal(reťazec strA, int indexA, reťazec strB, int indexB, počet int)

Robí to isté ako metóda Compare(), ale bez ohľadu na miestne nastavenia

Porovnať s() public int CompareTo(hodnota objektu)

Porovnáva volajúci reťazec s reťazcovou reprezentáciou objektu hodnoty. Vráti kladnú hodnotu, ak je volajúci reťazec väčší ako hodnota reťazca; záporná hodnota, ak je volací reťazec menší ako reťazec hodnoty; a nula, ak sú porovnávané reťazce rovnaké

public int CompareTo(reťazec strB)

Porovná volací reťazec so strB

Rovná sa() verejné prepísanie bool Rovná sa (objekt obj)

Vráti boolovskú hodnotu true, ak volajúci reťazec obsahuje rovnakú postupnosť znakov ako reťazcová reprezentácia obj. Vykonáva poradové porovnanie, pričom rozlišuje veľké a malé písmená, ale necitlivo reaguje na kultúru

public bool Rovná sa (reťazcová hodnota)

Public bool Rovná sa (hodnota reťazca, typ porovnávania reťazca)

Vráti boolovskú hodnotu true, ak volajúci reťazec obsahuje rovnakú postupnosť znakov ako hodnota reťazca. Vykonáva sa poradové porovnanie, pričom sa rozlišujú malé a veľké písmená, ale kultúrne necitlivé. Parameter CompareType definuje špecifický spôsob porovnávania reťazcov

public static bool Rovná sa (reťazec a, reťazec b)

Verejný statický bool Rovná sa (reťazec a, reťazec b, typ porovnávania reťazcov)

Vráti boolovskú hodnotu true, ak reťazec a obsahuje rovnakú postupnosť znakov ako reťazec b . Vykonáva sa poradové porovnanie, pričom sa rozlišujú malé a veľké písmená, ale kultúrne necitlivé. Parameter CompareType definuje špecifický spôsob porovnávania reťazcov

Reťazenie (spájanie) reťazcov
Concat() verejný statický reťazec Concat(reťazec str0, reťazec str1);

public static string Concat(params string values);

Spája samostatné inštancie reťazcov do jedného reťazca (reťazenie)
Vyhľadajte v reťazci
Obsahuje() public bool Obsahuje (hodnota reťazca) Metóda, ktorá vám umožňuje určiť, či reťazec obsahuje konkrétny podreťazec (hodnotu)
Začína s() public bool StartsWith(hodnota reťazca)

Public bool StartsWith(reťazcová hodnota, StringComparison CompareType)

Vráti boolovskú hodnotu true, ak volajúci reťazec začína podreťazcom hodnoty. V opačnom prípade sa vráti boolovská hodnota false. Parameter CompareType určuje, ako sa má vyhľadávanie vykonať.

EndsWith() public bool EndsWith(hodnota reťazca)

Public bool EndsWith(hodnota reťazca, StringComparison CompareType)

Vráti boolovskú hodnotu true, ak volajúci reťazec končí podreťazcom hodnoty. V opačnom prípade vráti boolovskú hodnotu false. Parameter CompareType definuje špecifickú metódu vyhľadávania

IndexOf() public int IndexOf(hodnota znaku)

Public int IndexOf(hodnota reťazca)

Nájde prvý výskyt daného podreťazca alebo znaku v reťazci. Ak sa hľadaný znak alebo podreťazec nenájde, vráti sa -1.

public int IndexOf(hodnota znaku, int startIndex)

Public int IndexOf(hodnota reťazca, int startIndex)

Public int IndexOf(hodnota znaku, int startIndex, int pocet)

Public int IndexOf(hodnota reťazca, int startIndex, int count)

Vráti index prvého výskytu hodnoty znaku alebo podreťazca vo volajúcom reťazci. Vyhľadávanie začína na prvku zadanom v indexe startIndex a zahŕňa počet prvkov zadaný parametrom count (ak je zadaný). Metóda vráti -1, ak sa hľadaný znak alebo podreťazec nenájde

LastIndexOf() Preťažené verzie sú podobné metóde IndexOf().

Rovnaké ako IndexOf, ale namiesto prvého nájde posledný výskyt znaku alebo podreťazca

IndexOfAny() public int IndexOfAny(char anyOf)

Public int IndexOfAny(char anyOf, int startIndex)

Public int IndexOfAny(char anyOf, int startIndex, int count)

Vráti index prvého výskytu ľubovoľného znaku v poli anyOf nájdeného vo volajúcom reťazci. Vyhľadávanie začína na prvku špecifikovanom indexom startIndex a zahŕňa počet prvkov zadaný parametrom count (ak existuje). Metóda vráti hodnotu -1, ak sa nenájde žiadna zhoda pre niektorý zo znakov v poli anyOf. Vyhľadávanie sa vykonáva bežným spôsobom

LastIndexOfAny Preťažené verzie sú podobné metóde IndexOfAny().

Vráti index posledného výskytu ľubovoľného znaku v poli anyOf nájdeného vo volajúcom reťazci

Rozdelenie a zreťazenie reťazcov
Rozdeliť public string Split (params char separator)

Public string Split (params char separator, int count)

Metóda, ktorá vracia pole reťazcov s podreťazcami prítomnými v tomto prípade, oddelené od seba prvkami zo zadaného poľa znakov alebo reťazcov.

Prvá forma metódy Split() rozdeľuje volajúci reťazec na jeho časti. Výsledkom je pole obsahujúce podreťazce získané z volajúceho reťazca. Znaky, ktoré vymedzujú tieto podreťazce, sa odovzdávajú v poli oddeľovačov. Ak je pole oddeľovača prázdne alebo odkazuje na prázdny reťazec, potom sa ako oddeľovač podreťazcov použije medzera. A v druhej forme túto metódu vráti počet podreťazcov zadaný parametrom count.

public string Split (params char separator, StringSplitOptions options)

Verejné rozdelenie reťazca (oddeľovač reťazcov, možnosti StringSplitOptions)

Public string Split (params char separator, int count, StringSplitOptions options)

Verejné rozdelenie reťazca (oddeľovač reťazcov, počet int, možnosti StringSplitOptions)

Prvé dve formy metódy Split() rozdelia volajúci reťazec na časti a vrátia pole obsahujúce podreťazce získané z volajúceho reťazca. Znaky, ktoré oddeľujú tieto podreťazce, sa odovzdávajú v poli oddeľovačov. Ak je pole oddeľovačov prázdne, potom sa ako oddeľovač použije medzera. A v tretej a štvrtej forme tejto metódy sa vráti počet riadkov obmedzený parametrom count.

Vo všetkých formách však parameter options špecifikuje špecifický spôsob spracovania prázdnych reťazcov, ktoré sa generujú, keď sú dva oddeľovače vedľa seba. Enumerácia StringSplitOptions definuje iba dve hodnoty: žiadne a RemoveEmptyEntries. Ak je parameter options None, potom sú do konečného výsledku rozdelenia zahrnuté prázdne reťazce. originálny reťazec. A ak je parameter options nastavený na RemoveEmptyEntries, potom sú prázdne reťazce vylúčené z konečného výsledku rozdelenia pôvodného reťazca.

Pripojiť sa () verejný statický reťazec Join (oddeľovač reťazcov, hodnota reťazca)

Verejný statický reťazec Join (oddeľovač reťazcov, hodnota reťazca, int startIndex, int count)

Vytvorí nový reťazec spojením obsahu poľa reťazcov.

Prvá forma metódy Join() vracia reťazec pozostávajúci zo zreťazených podreťazcov odovzdaných v poli hodnôt. Druhý formulár tiež vráti reťazec pozostávajúci z podreťazcov odovzdaných v poli hodnôt, ale sú zreťazené určitým počtom počtov, počnúc prvkom poľa hodnôt. V oboch formách je každý nasledujúci riadok oddelený od predchádzajúceho riadku oddeľovacím reťazcom určeným parametrom oddeľovača.

Plniace a orezávacie linky
orezať () verejný reťazec Trim()

Verejný reťazec Trim (parametre char trimChars)

Metóda, ktorá umožňuje odstrániť všetky výskyty zadanej množiny znakov zo začiatku a konca aktuálneho reťazca.

Prvá forma metódy Trim() odstraňuje z volajúceho reťazca medzery na začiatku a na konci. A druhá forma tejto metódy odstraňuje prvé a koncové výskyty vo volajúcom reťazci znakov z poľa trimChars. Obe formy vrátia výsledný reťazec.

PadLeft() verejný reťazec PadLeft(int totalWidth)

Verejný reťazec PadLeft(int totalWidth, char paddingChar)

Umožňuje vyplniť reťazec znakmi vľavo.

Prvá forma metódy PadLeft() zavádza medzery na ľavej strane volajúceho reťazca, takže jeho celková dĺžka bude rovná hodnote parameter totalWidth. V druhej forme tejto metódy sa znaky označené parametrom paddingChar zadávajú na ľavú stranu volajúceho reťazca tak, aby sa jeho celková dĺžka rovnala hodnote parametra totalWidth. Obe formy vrátia výsledný reťazec. Ak je hodnota parametra totalWidth menšia ako dĺžka volajúceho reťazca, vráti sa kópia neupraveného volacieho reťazca.

PadRight() Podobne ako PadLeft()

Umožňuje vyplniť reťazec znakmi vpravo.

Vkladanie, mazanie a nahradzovanie riadkov
vložiť() verejný reťazec Vložiť (int startIndex, hodnota reťazca)

Používa sa na vloženie jedného reťazca do druhého, kde hodnota je reťazec, ktorý sa má vložiť do volajúceho reťazca v indexe startIndex. Metóda vráti výsledný reťazec.

Odstrániť() public string Remove(int startIndex)

Verejný reťazec Remove (int startIndex, int count)

Používa sa na odstránenie časti šnúrky. V prvej forme metódy Remove() sa odstránenie vykonáva počnúc miestom zadaným indexom startIndex a pokračuje až do konca reťazca. A v druhej forme tejto metódy sa z reťazca odstráni počet znakov špecifikovaných parametrom count, počnúc miestom určeným indexom startIndex.

Nahradiť () public string Replace(char oldChar, char newChar)

Verejný reťazec Nahradiť (reťazec staráHodnota, reťazec nováHodnota)

Používa sa na nahradenie časti reťazca. Prvá forma metódy Replace() nahrádza všetky výskyty oldChar vo volajúcom reťazci za newChar. A v druhej forme tejto metódy sú všetky výskyty reťazca oldValue vo volajúcom reťazci nahradené reťazcom newValue.

Zmena prípadu
ToUpper() verejný reťazec ToUpper()

Všetky písmená vo volajúcom reťazci sú veľké.

Znížiť() verejný reťazec ToLower()

Všetky písmená v volacom reťazci budú malé.

Získanie podreťazca z reťazca
Podreťazec() verejný reťazec Podreťazec (int startIndex)

Verejný reťazec Podreťazec (int startIndex, int dĺžka)

V prvej forme metódy Substring() sa podreťazec extrahuje z miesta označeného parametrom startIndex na koniec volajúceho reťazca. A v druhej forme tejto metódy sa extrahuje podreťazec pozostávajúci z počtu znakov špecifikovaných parametrom dĺžky, počnúc miestom označeným parametrom startIndex.

Nasledujúci príklad programu používa niekoľko z vyššie uvedených metód:

pomocou systému; pomocou System.Collections.Generic; pomocou System.Linq; pomocou System.Text; menný priestor ConsoleApplication1 ( class Program ( static void Main(string args) ( // Porovnajte prvé dva reťazce string s1 = "toto je reťazec"; string s2 = "toto je text, toto je reťazec"); if (String.CompareOrdinal (s1, s2) != 0) Console.WriteLine("Reťazce s1 a s2 nie sú rovnaké"); if (String.Compare(s1, 0, s2, 13, 10, true) == 0) Console.WriteLine( "Obsahujú však rovnaký text"); // Zreťazenie reťazcov Console.WriteLine(String.Concat("\n" + "Jeden, dva ","tri, štyri")); // Hľadať v reťazci // Prvý výskyt podreťazca if (s2. IndexOf("this") != -1) Console.WriteLine("Slovo \"toto\" sa našlo v riadku, je to "+ "na: (0) pozícii", s2. IndexOf("this")); / / Posledný výskyt podreťazca if (s2.LastIndexOf("this") != -1) Console.WriteLine("Posledný výskyt \"this\" je " + "at ( 0) position", s2.LastIndexOf("this" )); // Vyhľadávanie z poľa znakov char myCh = ("S","x","t"); if (s2.IndexOfAny(myCh) != -1) Console.WriteLine("Jeden zo znakov z poľa ch "+" nájdených v aktuálnom aktuálny riadok na pozícii (0)", s2.IndexOfAny(myCh)); // Zistite, či reťazec začína daným podreťazcom if (s2.StartsWith("toto je text") == true) Console.WriteLine("Našiel sa podreťazec!"); // Určte, či reťazec obsahuje podreťazec // pomocou príkladu určenia reťazca operačného systému používateľa myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Váš OS systém Windows XP"); inak (myOS.Contains("NT 6.1")) Console.WriteLine("Váš operačný systém Windows 7"); Console.ReadLine(); ) ) )

Trochu o porovnaní reťazcov v C#

Zo všetkých operácií spracovania reťazcov znakov je to pravdepodobne najčastejšie vykonávané porovnávanie jedného reťazca s druhým. Predtým, ako sa pozriete na ktorúkoľvek z metód porovnávania reťazcov, je potrebné zdôrazniť nasledovné: Porovnanie reťazcov je možné vykonať v .NET Framework dvoma hlavnými spôsobmi:

    Po prvé, porovnanie môže odrážať zvyky a normy konkrétneho kultúrneho prostredia, ktoré sú často kultúrnymi nastaveniami, ktoré sa prejavia pri spustení programu. Toto je štandardné správanie niektorých, aj keď nie všetkých, porovnávacích metód.

    A po druhé, porovnanie možno vykonať bez ohľadu na nastavenia kultúrneho prostredia iba na ordinálnych hodnotách znakov, ktoré tvoria reťazec. Všeobecne povedané, kultúrne necitlivé porovnávanie reťazcov používa lexikografické poradie (a lingvistické znaky) na určenie, či je jeden reťazec väčší, menší alebo rovný druhému reťazcu. Pri ordinálnom porovnaní sú reťazce jednoducho usporiadané na základe neupravenej hodnoty každého znaku.

Z dôvodu rozdielov v spôsobe porovnávania reťazcov medzi kultúrami a radových porovnaní a dôsledkov každého takéhoto porovnávania dôrazne odporúčame, aby ste použili osvedčené postupy, ktoré v súčasnosti ponúka spoločnosť Microsoft. Nesprávny spôsob porovnávania reťazcov totiž môže spôsobiť nesprávne fungovanie programu, keď je prevádzkovaný v inom prostredí, než v akom bol vyvinutý.

Výber spôsobu porovnávania reťazcov znakov je veľmi dôležitým rozhodnutím. Vo všeobecnosti a bez výnimky by ste si mali zvoliť kultúrne citlivé porovnanie reťazcov, ak je to za účelom zobrazenia výsledku používateľovi (napríklad na zobrazenie série reťazcov zoradených v lexikografickom poradí). Ak však reťazce obsahujú pevné informácie, ktoré nie sú určené na úpravu pre kultúrne rozdiely, ako je napríklad názov súboru, kľúčové slovo, adresu webovej stránky alebo hodnotu súvisiacu so zabezpečením, potom by ste mali vybrať poradové porovnanie reťazcov. Samozrejme, špecifiká konkrétnej vyvíjanej aplikácie budú diktovať výber vhodného spôsobu porovnávania reťazcov znakov.

Trieda String poskytuje množstvo metód porovnávania reťazcov, ktoré sú uvedené v tabuľke vyššie. Najuniverzálnejšia z nich je metóda Compare(). Umožňuje porovnať dva reťazce úplne alebo čiastočne, rozlišujú sa malé a veľké písmená alebo nerozlišujú veľké a malé písmená, spôsobom porovnania určeným parametrom typu StringComparison, ako aj kultúrne informácie poskytované parametrom typu Kultúrne informácie.

Tie preťaženia metódy Compare(), ktoré neobsahujú parameter typu StringComparison, uskutočňujú porovnanie reťazcov znakov zohľadňujúce veľkosť písmen a jazykovú verziu. A v tých preťažených variantoch, ktoré neobsahujú parameter typu CultureInfo, sú informácie o kultúre určené aktuálnym prostredím runtime.

Typ StringComparison je enumerácia, ktorá definuje hodnoty uvedené v tabuľke nižšie. Pomocou týchto hodnôt môžete usporiadať porovnania reťazcov, ktoré vyhovujú potrebám vašej aplikácie. Preto pridanie parametra typu StringComparison rozširuje možnosti metódy Compare() a iných porovnávacích metód, ako je Equals(). Umožňuje tiež jednoznačne určiť, ako sa majú reťazce porovnávať.

Vzhľadom na rozdiely medzi kultúrne citlivými porovnávaniami reťazcov a radovými porovnávaniami je dôležité byť v tomto smere čo najpresnejší.

Hodnoty definované v zozname StringComparison
Význam Popis
CurrentCulture Porovnanie reťazcov sa vykonáva pomocou aktuálnych nastavení kultúry
CurrentCultureIgnoreCase Porovnanie reťazcov sa vykonáva s použitím aktuálnych nastavení kultúry, no nerozlišuje veľké a malé písmená
Invariantná kultúra Porovnávanie reťazcov sa robí pomocou nemenných, t.j. univerzálne údaje o kultúrnom prostredí
InvariantCultureIgnoreCase Porovnávanie reťazcov sa robí pomocou nemenných, t.j. univerzálne kultúrne údaje a nerozlišujú veľké a malé písmená
Radový Porovnanie reťazcov sa vykonáva pomocou radových hodnôt znakov v reťazci. V tomto prípade môže dôjsť k porušeniu lexikografického poriadku a dohovorov akceptované v konkrétnom kultúrnom prostredí sa ignorujú
OrdinalIgnoreCase Porovnanie reťazcov sa vykonáva pomocou radových hodnôt znakov v reťazci, ale nerozlišujú sa malé a veľké písmená

V oboch prípadoch metóda Compare() vráti zápornú hodnotu, ak je prvý porovnávaný reťazec menší ako druhý; kladná hodnota, ak je prvý porovnávaný reťazec väčší ako druhý; a nakoniec nula, ak sú oba porovnávané reťazce rovnaké. Hoci metóda Compare() vráti nulu, ak sú porovnávané reťazce rovnaké, vo všeobecnosti je lepšie použiť metódu Equals() alebo operátor == na určenie, či sú reťazce znakov rovnaké.

Faktom je, že metóda Compare() určuje rovnosť porovnávaných reťazcov na základe ich poradia. Napríklad, ak sa reťazce porovnávajú kultúrne, obidva reťazce môžu byť v poradí zoradenia rovnaké, ale nie v podstate rovnaké. V predvolenom nastavení je rovnosť reťazcov určená v metóde Equals() na základe ordinálnych hodnôt znakov a nie kultúrne. Preto sa v predvolenom nastavení porovnávajú oba reťazce v tejto metóde pre absolútnu zhodnosť znak po znaku, podobne ako to robí operátor ==.

Napriek veľkej univerzálnosti metódy Compare() je na jednoduché poradové porovnanie reťazcov znakov jednoduchšie použiť metódu CompareOrdinal(). A nakoniec, majte na pamäti, že metóda CompareTo() porovnáva reťazce iba kultúrne citlivým spôsobom.

Nasledujúci program demonštruje použitie metód Compare(), Equals(), CompareOrdinal() a operátorov == a != na porovnanie reťazcov znakov. Všimnite si, že prvé dva porovnávacie príklady jasne demonštrujú rozdiely medzi kultúrne citlivým porovnávaním reťazcov a anglickým poradovým porovnaním:

pomocou systému; class Príklad ( static void Main() ( string str1 = "alfa"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alfa"; string str5 = "alfa, beta"; int vysledok; / / Najprv ukážte rozdiely medzi porovnávaním reťazcov citlivých na kultúru a výsledkom poradového porovnávania = String.Compare(str1, str2, StringComparison.CurrentCulture); Console.Write("Porovnanie reťazcov citlivých na kultúru: "); if (výsledok 0 ) Konzola .WriteLine(str1 + " je väčšie ako " + str2); inak Console.WriteLine(str1 + "je " + str2); výsledok = String.Compare(str1, str2, StringComparison.Ordinal); Console.Write("Ordinálne porovnanie riadky: "); if (výsledok 0) Console.WriteLine(str1 + " je väčšie ako " + str2); inak Console.WriteLine(str1 + "je rovné " + str4); // Použitie výsledku metódy CompareOrdinal() = String.CompareOrdinal( str1, str2); Console.Write("Porovnať reťazce pomocou CompareOrdinal():\n"); if (výsledok 0) Console.WriteLine(str1 + " väčšie ako " + str2); inak Console.WriteLine (str 1 + "sa rovná " + str4); Console.WriteLine(); // Určenie rovnosti reťazcov pomocou operátora == // Toto je poradové porovnanie reťazcov znakov if (str1 == str4) Console.WriteLine(str1 + " == " + str4); // Zistenie nerovnosti riadku pomocou operátora != if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Console.WriteLine(); // Vykonanie poradového porovnania reťazcov bez ohľadu na veľkosť písmen pomocou metódy Equals() if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Porovnanie reťazcov pomocou metódy Equals() s parametrom " + " OrdinalIgnoreCase: \n" + str1 + " sa rovná " + str2); Console.WriteLine(); // Porovnanie častí reťazcov if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Porovnávanie reťazcov na základe aktuálnej kultúry:" + "\n3 prvé znaky reťazca " + str2 + " je väčší ako prvé 3 znaky reťazca " + str5); ) ) )

Spustenie tohto programu poskytuje nasledujúci výsledok:

V jazyku C neexistuje samostatný dátový typ „reťazec znakov“. Práca s reťazcami je realizovaná pomocou jednorozmerných polí typu char, t.j. znakový reťazec je jednorozmerné pole znakov ukončené nulovým bajtom.

Nulový bajt je bajt, ktorého každý bit sa rovná nule, pričom pre nulový bajt je definovaná znaková konštanta '\0' (zakončovanie riadku alebo nulové ukončenie). Ak teda reťazec musí obsahovať k znakov, potom v popise poľa musí byť špecifikovaných k+1 prvkov.

Napríklad char a; - znamená, že reťazec môže obsahovať šesť znakov a posledný bajt je vyhradený pre nulu.

Reťazcová konštanta je množina uzavretých znakov dvojité úvodzovky. Napríklad:

char S="Práca s reťazcami";

Nie je potrebné explicitne špecifikovať znak '\0' na konci reťazcovej konštanty.

Pri práci s reťazcami je vhodné použiť ukazovatele, napríklad:

x = "BSUIR";

x = (i>0)? "pozitívne": (t.j<0)? "отрицательное":"нулевое";

Pripomeňme, že na zadávanie reťazcov sa bežne používajú dve štandardné funkcie:

scanf()- zavádza hodnoty pre reťazcové premenné so špecifikátorom vstupu %s pred výskytom prvého znaku „medzera“ (znak „&“ nie je potrebné špecifikovať pred ID údajov reťazca);

dostane()- zadávanie riadku s medzerami v tomto riadku sa ukončí stlačením klávesu ENTER.

Obe funkcie automaticky ukončia reťazec nulovým bajtom.

Riadky sú na výstupe pomocou funkcií printf() alebo puts() až do prvého nulového bajtu ('\0'):

printf() nepresunie kurzor po výstupe na začiatok nového riadku;

kladie() automaticky presunie kurzor po výstupe informácie o reťazci na začiatok nového riadku.

Napríklad:

printf(" Zadajte reťazec bez medzier: \n");

scanf("%s",Str);

puts("Zadajte reťazec");

Zvyšné operácie s reťazcami sa vykonávajú pomocou štandardných knižničných funkcií, ktorých prototypy sú popísané v súbore reťazec.h. Poďme sa pozrieť na najčastejšie používané funkcie.

funkcia int strlen(char *S) vráti dĺžku reťazca (počet znakov v reťazci), pričom ignoruje ukončujúci nulový bajt.

char *S1=”Minsk!\0”, S2=”BSUIR-Hurá!”;

printf(“ %d, %d .”, strlen(S1), strlen(S2));

Výsledok tejto časti programu:

funkcia int strcpy(char *S1, char *S2) - skopíruje obsah reťazca S2 do reťazca S1.

Funkcia strcat(char *S1, char *S2) - spojí reťazec S2 s reťazcom S1 a umiestni ho do poľa, kde bol reťazec S1, pričom reťazec S2 sa nemení. Nulový bajt, ktorý ukončuje reťazec S1, je nahradený prvým znakom reťazca S2.

funkcia int strcmp(char *S1, char *S2) porovná reťazce S1 a S2 a vráti hodnotu<0, если S10, ak S1 > S2; =0, ak sú reťazce rovnaké, t.j. obsahujú rovnaký počet rovnakých znakov.

Funkcie na prevod reťazca S na číslo:

Celé číslo: int atoi(char*S);

Long Integer: dlhé atol(char*S);

Skutočné: dvojité atof(char*S);

pri chybe tieto funkcie vrátia 0.

Funkcie na prevod čísla V na reťazec S.

»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 tvrdá skutočnosť, ž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 vytvorená pomocou nepretržitých profesionálnych postupov SEO zdvojnásobí dopyty, podnikanie 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 vzťahovať sa 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 Pokúsením sa 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 je len otázkou 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 a 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. Uvedomte si, ž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 dešifrujte, č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.

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 (vstavaný reťazec) alebo iným objektom typu string . 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 používa funkcia strcat(), ale na získanie výsledku v novom riadku je potrebné 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.

Pozrime sa bližšie na tieto základné funkcie.

Inicializácia reťazca pri opise a dĺžka šnúrky(bez ukončovacieho 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 , napíšeme:

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ú objektmi reťazca triedy:

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:

Stringstr("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ť

mazanie znakov

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

Struny. Linkový vstup/výstup. Formátované I/O. Spracovanie reťazcov pomocou štandardných funkcií jazyka C. Práca s pamäťou.

1.1. Deklarovanie a inicializácia reťazcov.

Reťazec je pole znakov, ktoré končí prázdnym znakom '\0'. Reťazec je deklarovaný ako normálne pole znakov, napr.

char s1; // reťazec dlhý deväť znakov

char*s2; // ukazovateľ na reťazec

Rozdiel medzi ukazovateľmi s1 a s2 je v tom, že ukazovateľ s1 je pomenovaná konštanta, zatiaľ čo ukazovateľ s2 je premenná.

Konštanty reťazca sú uzavreté v dvojitých úvodzovkách, na rozdiel od znakov, ktoré sú uzavreté v jednoduchých úvodzovkách. Napríklad,

"Toto je reťazec."

Dĺžka reťazcovej konštanty nemôže presiahnuť 509 znakov podľa štandardu. Mnohé implementácie však umožňujú dlhšie reťazce.

Pri inicializácii reťazcov je lepšie neuvádzať rozmer poľa, kompilátor to urobí tak, že spočíta dĺžku reťazca a pridá k nemu jeden. Napríklad,

char s1 = “Toto je reťazec.”;

V programovacom jazyku C existuje veľké množstvo funkcií na prácu s reťazcami, ktorých prototypy sú popísané v hlavičkových súboroch stdlib.h a string.h. Práca s týmito funkciami bude diskutovaná v nasledujúcich odsekoch.

1.2. Linkový vstup/výstup.

Ak chcete zadať reťazec z konzoly, použite funkciu

char* dostane(char*str);

ktorý zapíše reťazec na adresu str a vráti adresu vstupného reťazca. Funkcia zastaví vstup, ak narazí na znak '\n' alebo EOF (koniec súboru). Znak nového riadku sa neskopíruje. Na koniec čítaného riadku sa umiestni nulový bajt. V prípade úspechu funkcia vráti ukazovateľ na riadok čítania a v prípade zlyhania vráti hodnotu NULL.

Na výstup reťazca do konzoly použite štandardnú funkciu

int vloží (const char *s);

ktorý vráti nezáporné číslo pri úspechu a EOF pri neúspechu.

Prototypy funkcií get a puts sú popísané v hlavičkovom súbore stdio.h.

#include

printf("Vstupny retazec: ");

1.3. Formátované I/O.

Pre formátovaný vstup z konzoly použite funkciu

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

ktorý vráti počet prečítaných dátových jednotiek pri úspechu a EOF pri neúspechu. Parameter format musí ukazovať na formátovací reťazec, ktorý obsahuje špecifikácie vstupného formátu. Počet a typy argumentov, ktoré nasledujú za formátovacím reťazcom, sa musia zhodovať s počtom a typmi vstupných formátov špecifikovaných vo formátovacom reťazci. Ak táto podmienka nie je splnená, potom je výsledok funkcie nepredvídateľný.

Medzera, znaky "\t" alebo "\n" vo formátovacom reťazci opisujú jeden alebo viacero prázdnych znakov vo vstupnom toku, ktoré zahŕňajú nasledujúce znaky: medzera, '\t', '\n', '\v', '\f'. Funkcia scanf preskakuje nulové znaky vo vstupnom toku.

Doslovné znaky vo formátovacom reťazci, s výnimkou znaku %, vyžadujú, aby sa vo vstupnom toku objavili presne tie isté znaky. Ak takýto znak neexistuje, scanf zastaví zadávanie. Funkcia scanf preskakuje doslovné znaky.

Vo všeobecnosti je špecifikácia formátu vstupu:

%[*] [šírka] [modifikátory] typ

Znak '*' označuje medzeru pri zadávaní poľa definovaného touto špecifikáciou;

- „šírka“ definuje maximálny počet znakov zadaných touto špecifikáciou;

Typ môže nadobúdať nasledujúce hodnoty:

c je pole znakov,

s – reťazec znakov, reťazce sú oddelené prázdnymi znakmi,

d je celé číslo so znamienkom pri rýchlosti 10 s/s,

i je celé číslo so znamienkom, číselný systém je založený na prvých dvoch čísliciach,

u je celé číslo bez znamienka za 10 s/s,

o je celé číslo bez znamienka za 8 s/s,

x, X je celé číslo bez znamienka v 16 s/s,

e, E, f, g, G - plávajúce číslo,

p je ukazovateľ na ukazovateľ,

n je ukazovateľ na celé číslo,

[…] je pole naskenovaných znakov, napríklad .

V druhom prípade sa zo vstupného toku zadajú iba znaky v hranatých zátvorkách. Ak je prvý znak v hranatých zátvorkách '^', zadajú sa len tie znaky, ktoré nie sú zahrnuté v poli. Rozsah znakov v poli je určený znakom '-'. Pri zadávaní znakov sa zadávajú aj prvé prázdne znaky a ukončovací nulový bajt reťazca.

Modifikátory môžu nadobúdať nasledujúce hodnoty:

h je krátke celé číslo,

l, L - dlhé celé číslo alebo float,

a používajú sa iba pre celé čísla alebo pohyblivé čísla.

Nasledujúci príklad ukazuje prípady použitia funkcie scanf. Všimnite si, že pred špecifikátorom formátu je pred zadaním pohyblivého čísla medzera.

#include

printf("Zadajte celé číslo: ");

scanf("%d", &n);

printf("Zadajte double: ");

scanf(" %lf", &d);

printf("Zadajte znak: ");

scanf(" %c", &c);

printf("Zadajte reťazec: ");

scanf("%s", &s);

Všimnite si, že v tomto programe sa inicializuje číslo s pohyblivou rádovou čiarkou. Robí sa to preto, aby kompilátor obsahoval knižnicu na podporu práce s pohyblivými číslami. Ak tak neurobíte, pri zadávaní pohyblivého čísla sa v čase spustenia vyskytne chyba.

Pre formátovaný výstup do konzoly použite funkciu

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

ktorý vráti počet výstupných jednotiek pri úspechu a EOF pri neúspechu. Parameter format je formátovací reťazec, ktorý obsahuje špecifikácie výstupného formátu. Počet a typy argumentov, ktoré nasledujú za formátovacím reťazcom, sa musia zhodovať s počtom a typmi špecifikácií výstupného formátu uvedeným vo formátovacom reťazci. Vo všeobecnosti je špecifikácia výstupného formátu:

%[príznaky] [šírka] [.presnosť] [modifikátory] typ

- „príznaky“ sú rôzne symboly, ktoré určujú výstupný formát;

- 'width' definuje minimálny počet výstupných znakov podľa tejto špecifikácie;

- „.precision“ definuje maximálny počet znakov na výstup;

- „modifikátory“ špecifikujú typ argumentov;

- 'typ' určuje typ argumentu.

Na tlač celých čísel so znamienkom sa používa nasledujúci výstupný formát:

%[-] [+ | medzera] [šírka] [l] d

- – zarovnanie vľavo, štandardne – vpravo;

+ – zobrazí sa znamienko „+“, všimnite si, že pre záporné čísla sa vždy zobrazí znamienko „-“;

„medzera“ – na pozícii znaku sa zobrazí medzera;

d je typ údajov int.

Na výstup celých čísel bez znamienka sa používa nasledujúci výstupný formát:

%[-] [#] [šírka] [l]

# - zobrazí začiatočnú 0 pre čísla v 8 c/c alebo začiatočné 0x alebo 0X pre čísla v 16 c/c,

l – modifikátor typu dlhých údajov;

u je celé číslo v 10c/c,

o je celé číslo v 8 c/c,

x, X je celé číslo v 16 c/c.

Na zobrazenie čísel s pohyblivou rádovou čiarkou sa používa nasledujúci výstupný formát:

%[-] [+ | medzera] [šírka] [.presnosť]

"presnosť" označuje počet číslic za desatinnou čiarkou pre formáty f, e a E alebo počet platných číslic pre formáty g a G. Čísla sú zaokrúhlené. Predvolená je presnosť na šesť desatinných miest;

f je číslo pevného bodu,

e je číslo v exponenciálnom tvare, exponent je označený písmenom "e",

E je číslo v exponenciálnom tvare, exponent je označený písmenom "E",

g je najkratší z formátov f alebo g,

G je najkratší z formátov f alebo G.

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

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

1.4. Formátovanie reťazca.

Existujú varianty funkcií scanf a printf, ktoré sú určené na formátovanie reťazcov a nazývajú sa sscanf a sprintf.

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

načíta údaje z reťazca určeného parametrom str podľa formátovacieho reťazca určeného parametrom format. Vráti množstvo prečítaných údajov pri úspechu, EOF pri neúspechu. Napríklad,

#include

char str = "a 10 1.2 String Bez vstupu";

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

printf("%c\n", c); // vytlačí: a

printf("%d\n", n); // vytlačí: 10

printf("%f\n", d); // výtlačky: 1,200000

printf("%s\n", s); // vypíše: String

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

naformátuje reťazec podľa formátu určeného parametrom format a výsledok zapíše do poľa znakov vyrovnávacej pamäte. Funkcia vráti počet znakov zapísaných do poľa znakov vyrovnávacej pamäte, s výnimkou ukončujúceho nulového bajtu. Napríklad,

#include

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

char s = "Toto je reťazec.";

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

printf("%s\n", buffer); // vytlačí: c = c, n = 10, d = 1,200000, s = Toto je reťazec

1.5. Preveďte reťazce na číselné údaje.

Prototypy funkcií na prevod reťazcov na číselné údaje sú uvedené v hlavičkovom súbore stdlib.h, ktorý musí byť súčasťou programu.

Ak chcete previesť reťazec na celé číslo, použite funkciu

int atoi (const char *str);

char *str = "-123";

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

Ak chcete previesť reťazec na dlhé celé číslo, použite funkciu

long int atol (const char *str);

ktorá, ak je úspešná, vráti celé číslo, na ktoré bol reťazec str prevedený, a 0, ak je neúspešná. Napríklad

char *str = "-123";

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

Ak chcete previesť reťazec na dvojitý, použite funkciu

double atof (const char *str);

ktorá v prípade úspechu vráti plávajúce číslo typu double, na ktoré sa skonvertuje reťazec str a v prípade neúspechu 0. Napr.

char *str = "-123,321";

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

Nasledujúce funkcie vykonávajú podobné funkcie ako atoi, atol, atof, ale poskytujú viac funkcií.

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

skonvertuje reťazec str na dlhý int, ktorý vráti. Parametre tejto funkcie majú nasledujúci účel.

Ak je základný argument 0, potom prevod závisí od prvých dvoch znakov str:

Ak je prvým znakom číslica od 1 do 9, potom sa predpokladá, že číslo je reprezentované v 10 c/c;

Ak je prvý znak číslo 0 a druhý je číslo od 1 do 7, potom sa predpokladá, že číslo je reprezentované v 8 c/c;

Ak je prvý znak 0 a druhý znak je 'X' alebo 'x', potom sa predpokladá, že číslo je reprezentované v 16 c/c.

Ak je základný argument číslo od 2 do 36, potom sa táto hodnota berie ako základ číselnej sústavy a každý znak, ktorý presahuje tento systém, zastaví prevod. Číselné sústavy so základmi 11 až 36 používajú na vyjadrenie číslic symboly „A“ až „Z“ alebo „a“ až „z“.

Hodnotu argumentu endptr nastavuje funkcia strtol. Táto hodnota obsahuje ukazovateľ na znak, ktorý zastavil konverziu str. Funkcia strtol vráti prevedené číslo pri úspechu a 0 pri neúspechu. Napríklad

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

funguje podobne ako funkcia strtol, ale konvertuje znakovú reprezentáciu čísla na dlhý int bez znamienka.

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

prevedie symbolickú reprezentáciu čísla na dvojnásobok.

Všetky funkcie uvedené v tomto odseku zastavia svoju činnosť, keď narazia na prvý znak, ktorý nezodpovedá formátu príslušného čísla.

Okrem toho, ak hodnota znaku čísla presahuje rozsah povolených hodnôt pre príslušný typ údajov, funkcie atof, strtol, strtoul, strtod nastavia hodnotu premennej errno na ERANGE. Premenná errno a konštanta ERANGE sú definované v hlavičkovom súbore math.h. Funkcie atof a strtod vrátia hodnotu HUGE_VAL, funkcia strtol vráti hodnotu LONG_MAX alebo LONG_MIN a funkcia strtoul vráti hodnotu ULONG_MAX.

Neštandardné funkcie itoa, ltoa, utoa, ecvt, fcvt a gcvt možno použiť na konverziu číselných údajov na reťazce znakov. Na tieto účely je však lepšie použiť štandardnú funkciu sprintf.

1.6. Štandardné funkcie pre prácu s reťazcami.

V tejto časti sa uvažuje o funkciách na prácu s reťazcami, ktorých prototypy sú popísané v hlavičkovom súbore string.h.

1. Porovnanie reťazcov. Funkcie strcmp a strncmp sa používajú na porovnávanie reťazcov.

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

lexikograficky porovná reťazce str1, str2 a vráti -1, 0 alebo 1, ak je str1 menšie, rovné alebo väčšie ako str2.

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

lexikograficky porovnáva najviac prvých n znakov z reťazcov str1 a str2. Funkcia vráti -1, 0 alebo 1, ak prvých n znakov str1 je menších, rovných alebo väčších ako prvých n znakov str2.

// príklad porovnania reťazcov

#include

#include

char str1 = "aa bb";

char str2 = "aa aa";

char str3 = "aa bb cc";

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

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

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

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

2. Kopírovanie riadkov. Na kopírovanie reťazcov sa používajú funkcie strcpy a strncpy.

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

skopíruje reťazec str2 do reťazca str1. Reťazec str2 sa skopíruje celý, vrátane koncového nulového bajtu. Funkcia vráti ukazovateľ na str1. Ak sa čiary prekrývajú, výsledok je nepredvídateľný.

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

skopíruje n znakov z reťazca str2 do reťazca str1. Ak reťazec str2 obsahuje menej ako n znakov, potom sa posledný nulový bajt skopíruje toľkokrát, koľkokrát je potrebné na rozšírenie reťazca str2 na n znakov. Funkcia vráti ukazovateľ na reťazec str1.

char str2 = "Kopírovať reťazec.";

strcpy(str1, str2);

printf(str1); // vypíše: Kopírovať reťazec.

4. Spojovacie struny. Funkcie strcat a strncat sa používajú na zreťazenie reťazcov do jedného reťazca.

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

zreťazí reťazec str2 s reťazcom str1, pričom koncový nulový bajt reťazca str1 sa vymaže. Funkcia vráti ukazovateľ na reťazec str1.

char* strncat (char *str1, const char *str2, veľkosť_t n);

zreťazí n znakov z reťazca str2 do reťazca str1, pričom vymaže koncový nulový bajt str1. Funkcia vráti ukazovateľ na reťazec str1. ak je dĺžka reťazca str2 menšia ako n, potom sa pridajú iba znaky obsiahnuté v reťazci str2. Po zreťazení reťazca sa k str1 vždy pridá nulový bajt. Funkcia vráti ukazovateľ na reťazec str1.

#include

#include

char str1 = "reťazec";

char str2 = "katenácia";

char str3 = "Áno Nie";

strcat(str1, str2);

printf("%s\n", str1); // vypíše: Sieťovanie reťazca

strncat(str1, str3, 3);

printf("%s\n", str1); // vypíše: Reťazec reťazca Áno

5. Vyhľadajte znak v reťazci. Funkcie strchr, strrchr, strspn, strcspn a strpbrk sa používajú na vyhľadávanie znaku v reťazci.

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

hľadá prvý výskyt znaku špecifikovaného parametrom c v reťazci str. V prípade úspechu funkcia vráti ukazovateľ na prvý nájdený znak a v prípade zlyhania vráti hodnotu NULL.

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

hľadá posledný výskyt znaku zadaného parametrom c v reťazci str. V prípade úspechu funkcia vráti ukazovateľ na posledný nájdený znak a v prípade zlyhania vráti hodnotu NULL.

#include

#include

char str = "vyhľadávanie znakov";

printf("%s\n", strchr(str, "r")); // vypíše: r hľadanie

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

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

vráti index prvého znaku v str1, ktorý nie je v str2.

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

vráti index prvého znaku v str1, ktorý je v str2.

char str = "123 abc";

printf("n = %d\n", strspn(str, "321"); // vypíše: n = 3

printf("n = %d\n", strcspn(str, "cba"); // vypíše: n = 4

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

nájde prvý znak v str1, ktorý sa rovná jednému zo znakov v str2. V prípade úspechu funkcia vráti ukazovateľ na tento znak a v prípade zlyhania vráti hodnotu NULL.

char str = "123 abc";

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

6. Porovnanie strún. Funkcia strstr sa používa na porovnávanie reťazcov.

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

nájde prvý výskyt reťazca str2 (bez koncového nulového bajtu) v reťazci str1. V prípade úspechu funkcia vráti ukazovateľ na nájdený podreťazec a v prípade zlyhania vráti hodnotu NULL. Ak ukazovateľ str1 ukazuje na reťazec nulovej dĺžky, funkcia vráti ukazovateľ str1.

char str = "123 abc 456;

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

7. Analýza reťazca na tokeny. Funkcia strtok sa používa na analýzu reťazca na tokeny.

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

vráti ukazovateľ na nasledujúci token (slovo) v reťazci str1, kde oddeľovače tokenov sú znaky z reťazca str2. Ak sú tokeny ukončené, funkcia vráti hodnotu NULL. Pri prvom volaní funkcie strtok musí parameter str1 ukazovať na reťazec, ktorý sa analyzuje do tokenov, a pri ďalších volaniach musí byť tento parameter nastavený na hodnotu NULL. Po nájdení tokenu funkcia strtok zapíše za tento token namiesto oddeľovača nulový bajt.

#include

#include

char str = "12 34 ab cd";

p = strtok(str, " ");

printf("%s\n",p); // vypíše hodnoty v stĺpci: 12 34 ab cd

p = strtok(NULL, " ");

8. Určenie dĺžky šnúrky. Funkcia strlen sa používa na určenie dĺžky reťazca.

size_t strlen(const char *str);

vráti dĺžku reťazca, pričom ignoruje posledný nulový bajt. Napríklad,

char str = "123";

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

1.7. Funkcie pre prácu s pamäťou.

Hlavičkový súbor string.h popisuje aj funkcie pre prácu s pamäťovými blokmi, ktoré sú podobné zodpovedajúcim funkciám pre prácu s reťazcami.

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

hľadá prvý výskyt znaku zadaného c v n bajtoch str.

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

porovnáva prvých n bajtov str1 a str2.

void* memcpy(const void *str1, const void *str2, veľkosť_t n);

skopíruje prvých n bajtov z reťazca str1 do reťazca str2.

void* memmove(const void *str1, const void *str2, veľkosť_t n);

skopíruje prvých n bajtov z str1 do str2, čím zaistí správne spracovanie prekrývajúcich sa reťazcov.

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

skopíruje znak určený c do prvých n bajtov str.