»Usaldusväärne SEO agentuur India võib suurendada väikeettevõtete tulusid
80% kasutajatest otsivad enne ostu sooritamist Google'ist ja teistest otsingumootoritest ning üle 50% otsingumootorite kaudu tehtud päringutest konverteeritakse. Need kaks statistikat tõestavad otsingumootori optimeerimise tähtsust. Selliseid statistikat ja fakte on palju, mis annavad selge punkti: iga väike, keskmine või suur ettevõte vajab professionaalseid SEO teenuseid. Väikeettevõtted ja idufirmad seisavad sageli silmitsi eelarveprobleemidega. Nad võivad võtta abi mis tahes usaldusväärselt India SEO agentuurilt, et saada oma eelarves parimat SEO-teenust, et suurendada oma tulusid.
Otsingul on suur mõju tarbijate meeltele. Vastavalt statistikale, mida jagavad suuremad otsingumootori optimeerimise eksperdid erinevatel volitatud veebisaitidel, nagu Search Engine Land, Moz, SEO Journal, Digital Marketers India, Hubspot jne. SEO hõivab suurema osa müügivihjetest. Samuti on orgaaniliste otsingutulemuste müügivihjetel kõrgem konversioonimäär. See statistika ja tarbijakäitumine näitavad selgemalt, et parim SEO teenus ei ole luksus, vaid iga ettevõtte jaoks vajalik.
Konkurentsist mööda hiilimiseks ja ärikasvu suurendamiseks peab iga organisatsioon kasutama otsingumootori optimeerimise teenuseid. Suured kaubamärgid saavad investeerida piisavalt raha professionaalse SEO teenuse jaoks, mida pakub tipp SEO ettevõte või SEO spetsialist, kuid väikeettevõtete omanikud teevad selle teenuse kvaliteedis sageli järeleandmisi väiksema eelarve tõttu. On karm tõsiasi, et väikeettevõtted ja idufirmad jätavad lõpuks võimalused, mida saab luua professionaalse SEO teenusega või kasutavad odavat SEO teenust, mis ei anna positiivseid tulemusi.
Väikeettevõtete omanikud ja alustavad ettevõtted saavad professionaalsetest SEO-teenustest kasu isegi piiratud eelarvega. Parim lahendus on leida usaldusväärne SEO ettevõte, mis asub Indiast. Indias on palju SEO eksperte, kes teevad koostööd digitaalse turunduse agentuuriga ja pakuvad oma valdkonna parimaid teenuseid. Nad võivad pakkuda teile vajalikke SEO teenuseid teie eelarve piires. Palga üle saab läbi rääkida India SEO agentuuriga, et saada paremaid teenuseid madalamate hindadega. Ärge aga langege odava SEO teenuse alla, mis maksab vähem ja lubab anda rohkem, kuna asjatundlikkus on oma kulul. Enne ettevõttega lepingu sõlmimist peate nägema portfelli või esitama asjakohaseid küsimusi.
India SEO-eksperdid tunnevad otsingumootoritele optimeerimise parimaid tavasid. Lisaks on Indias mõned SEO spetsialistid, näiteks Ash Vyas, kes on spetsialiseerunud ettevõtte jaoks parima otsingumootori optimeerimise strateegia loomisele määratud eelarvega. SEO spetsialistid koostavad selge plaani ja jagavad ka, millised võivad olla oodatud tulemused. Nii saate oma investeeringust ja tootlusest hästi kursis olla. See aitab teha paremaid äriotsuseid.
Hea mõte on leida usaldusväärne Indiast pärit SEO-ettevõte, mis pakub võimalikult kiiresti parimaid SEO-teenuseid, ja sõlmida sellega leping. Võite alustada ka väikese eelarve ja piiratud tegevustega, et alustada oma veebilehtede indekseerimist ja märksõnade suurendamist otsingumootorites. Ärge oodake ideaalset aega või päeva, mil teil on tuhandeid dollareid, et investeerida parimatesse SEO teenustesse. Varajane alustamine aitab teil saavutada kiiremaid tulemusi, kui saate oma turundusmeetodiga agressiivseks minna. Indiast pärit usaldusväärne SEO-ettevõte aitab teil määratleda teie praegused ja tulevased plaanid heade tulemuste saamiseks. Rohkem indekseeritud lehti tõstsid paremusjärjestust ja teie ettevõtte usaldusväärne bränd, mis on loodud pideva professionaalse SEO praktikaga, kahekordistab päringuid, äritegevust ja tulusid. Iga väikeettevõte võib alustada kahekohalise investeeringuga professionaalsetesse SEO teenustesse. Indias on palju SEO agentuure, mis pakuvad madala eelarvega, kuid tulenevad otsingumootori optimeerimise teenustest.
küsitlusi pagulusest
-
CraigWew
12.04.2018»Kliendiga suhte loomise tähtsus kinnisvara- ja üldmüügis
Kliendiga suhte loomise tähtsus.
Kliendiga suhte loomine tuleb välja teenida ja sellele tuleb läheneda kui müügiprotsessi väga lahutamatule osale.
Selleks, et klient ja iseennast saaksid päriselt üks ühele suhestuma, hõlmab kahte asja!
Esiteks peate olema teadlik ja kohal! Teiseks peate mõistma, et selle protsessi käigus toimub kaks erinevat etappi.
A-Ole seal-mida see tähendab?
o Enamik inimesi ei kuula tegelikult teist inimest, kui ta räägib. Üldjuhul on nad oma järgmise vastuse või väite sõnastamisega nii hõivatud, et nad ei suuda üldse kuulata.
o Kui see kõlab nagu sina, tähendab seal olemine vait ja kuula!
B-Mis on esimene ehk esialgne etapp?
o Üldjuhul on teil vaid mõni minut aega, et kehtestada end klientide silmis inimesena, kellega nad soovivad suhelda.
o Kahtluse korral on kõige parem esitada esmalt küsimusi, mis tõmbavad neid esile ja räägivad endast.
o Samuti on alati turvaline esineda professionaalina – ma ei pea silmas stoilist ega kuiva, vaid kedagi, kes teab, mida teeb ja räägib ja vaatab osa.
C-Teised etapid
o Aja möödudes saate vestluse ja neile tekkivate küsimuste kaudu oma võime kindlaks teha või mitte.
o Olge teadlik, et nad tõenäoliselt mõõdavad teid mõnda aega. Hea uudis on see, et kui teil on õnnestunud suhte loomine mingil hetkel, siis nad lõdvestuvad ja saate mõlemad keskenduda kodu leidmisele või müümisele.
Mis veel aitab mul suhtlust arendada?
o Püüdes mõista erinevaid isiksusetüüpe ja seejärel öelda ja küsida õigeid küsimusi.
o Kui sul on hea läbisaamine (olid kliendiga samal lainepikkusel), siis on müük põhimõtteliselt lõppenud, nüüd jääb üle vaid õige kodu leida või noteerimispaberid täita.
Kuidas on lood erinevate isiksustega
o Kuna see raamat ei ole psühhiaatriateemaline, mõistke praegu vaid kahte peamist tüüpi.
o On introvertseid ja ekstravertseid inimesi.
o Sa tead tüüpi. Mõelge kolmele tuttavale inimesele, kes sobivad igasse klassifikatsiooni.
Aga kehakeel ja kõnemustrid?
o Kui nad räägivad kiiresti või aeglaselt, proovige nende kõnemustreid jäljendada.
o Kui nad räägivad valjult või pehmelt, tehke sama. Kas nad kalduvad ette või taha?
o Ütlematagi selge, et sellel teemal on kirjutatud palju raamatuid. Pidage lihtsalt meeles, et see on oluline tegur – eriti kui istud konverentsiruumis või kellegi kodus ja arutame 400 000 dollari suurust tehingut.
Suhtlemise arendamine on oskus, mida saab õppida ja täiendada.
o Me kõik oleme kogenud müüjat, kes meile midagi müüs, kuid me ei tundnud, et meid müüakse. Põhjus on selles, et ta pani teid tundma end mugavalt seal, kus te neid usaldasite.
Kuidas arendame suhtlust?
o Kasutage oma silmi ja kõrvu ning esitage küsimusi. selgitama
o Kasutage silmi:
o Vaadake nende kleiti - nende autot - nende isiklikku vara ja ma tõesti mõtlen, et vaadake neid ja mõelge lahti, mida see teile nende kohta ütleb.
o Kasutage kõrvu:
o Kuulake, mida nad räägivad, ja esitage küsimusi, et jõuda nende tegeliku MOTIVATSIOONI põhja!
Nüüd kogu selle vestluse ajal avastate tõenäoliselt ühe või kaks asja, mis teil nendega ühine on. (Perekond, geograafilised piirkonnad, kalapüük jne) Kui leiate ühiseid seisukohti, andke neile teada, et olete tuttav ja seejärel arutlege nendega.
Mis on eesmärk?
o Kui nad aktsepteerivad teid ühena nende seast, saate tõeliselt suure müügikogemuse, kuna töötate nüüd koos ja siis meeskonnana – te pole enam see müügimees, kes praegu nõuandval positsioonil .
o Pea meeles, et klient kas lubab või ei luba sul oma maailma siseneda. Kui mõistate seda ja teete temaga empaatiliseks muutmiseks kõvasti tööd, võite saada usaldusliku positsiooni. Enamikul juhtudel näete neid tegelikult lõõgastumas (kehakeel), kui see juhtub, kui olete teel.
o Selle illustreerimiseks kas olete kunagi esinenud ja märganud, et kui olete lõpuks mõne kuulajaskonna liikmega ühenduse loonud, noogutavad nad heakskiitvalt. Need asjad võivad tunduda tühised, kuid see pole nii.
Lõpetuseks, kui saate klientide usalduse teenida, on toote või teenuse müümine palju lihtsam ja kogemus võib olla kõigile asjaosalistele ebameeldiv.
Pidage alati meeles, et võit/võit on parim olukord.
Stringid. Liin sisend/väljund. Vormindatud I/O. Stringide töötlemine standardsete C keele funktsioonide abil.Töö mäluga.
1.1. Stringide deklareerimine ja initsialiseerimine.
String on märkide massiiv, mis lõpeb tühja märgiga „\0”. String deklareeritakse tavalise märgimassiivina, näiteks
char s1; // üheksa tähemärki pikk string
char*s2; // osuti stringile
Osutite s1 ja s2 erinevus seisneb selles, et osuti s1 on nimega konstant, osuti s2 aga muutuja.
Stringikonstandid on ümbritsetud topeltjutumärkidega, erinevalt tähemärkidest, mis on ümbritsetud ühekordsete jutumärkidega. Näiteks,
"See on string."
Stringikonstandi pikkus ei tohi standardi järgi ületada 509 tähemärki. Paljud teostused võimaldavad aga pikemaid stringe.
Stringide lähtestamisel on parem mitte määrata massiivi dimensiooni, kompilaator loeb stringi pikkuse ja lisab sellele ühe. Näiteks,
char s1 = "See on string.";
Programmeerimiskeeles C on stringidega töötamiseks suur hulk funktsioone, mille prototüüpe kirjeldatakse päisefailides stdlib.h ja string.h. Nende funktsioonidega töötamist käsitletakse järgmistes lõikudes.
1.2. Liin sisend/väljund.
Stringi sisestamiseks konsoolist kasutage funktsiooni
char* gets(char*str);
mis kirjutab stringi aadressiks str ja tagastab sisendstringi aadressi. Funktsioon peatab sisestuse, kui see kohtab märki '\n' või EOF (faili lõpp). Reavahetusmärki ei kopeerita. Nullbait asetatakse lugemisrea lõppu. Edu korral tagastab funktsioon kursori lugemisreale ja ebaõnnestumise korral NULL.
Stringi konsooli väljastamiseks kasutage standardfunktsiooni
int paneb (const char *s);
mis tagastab mittenegatiivse arvu edu ja EOF ebaõnnestumise korral.
Hangi ja paneb funktsioonide prototüüpe kirjeldatakse päisefailis stdio.h.
#kaasa
printf("Sisendstring: ");
1.3. Vormindatud I/O.
Konsoolist vormindatud sisendi jaoks kasutage funktsiooni
int scanf (const char *vorming, ...);
mis tagastab edu korral loetud andmeühikute arvu ja ebaõnnestumise korral EOF-i. Vormingu parameeter peab osutama vormingustringile, mis sisaldab sisendvormingu spetsifikatsioone. Vormingutringile järgnevate argumentide arv ja tüübid peavad ühtima vormingustringis määratud sisendvormingute arvu ja tüüpidega. Kui see tingimus ei ole täidetud, on funktsiooni tulemus ettearvamatu.
Tühikud, tähemärgid "\t" või "\n" vormingustringis kirjeldavad üht või mitut tühja tähemärki sisendvoos, mis sisaldavad järgmisi märke: tühik, '\t', '\n', '\v', '\f'. Funktsioon scanf jätab sisendvoos nullmärgid vahele.
Literaalsed märgid vormingustringis, välja arvatud % märk, nõuavad täpselt samade märkide ilmumist sisendvoos. Kui sellist märki pole, peatab scanf sisendi. Funktsioon scanf jätab sõnasõnalised tähemärgid vahele.
Üldiselt on sisendvormingu spetsifikatsioon järgmine:
%[*] [laius] [muutjad] tüüp
Märk „*” tähistab lünka selle spetsifikatsiooniga määratletud välja sisestamisel;
- "laius" määrab selle spetsifikatsiooniga sisestatavate märkide maksimaalse arvu;
Tüüp võib võtta järgmisi väärtusi:
c on tähemärkide massiiv,
s – märgistring, stringid eraldatakse tühjade tähemärkidega,
d on märgiga täisarv kiirusel 10 s/s,
i on märgiga täisarv, numbrisüsteem põhineb kahel esimesel numbril,
u on märgita täisarv kiirusega 10 s/s,
o on märgita täisarv kiirusega 8 s/s,
x, X on märgita täisarv kiirusega 16 s/s,
e, E, f, g, G – ujuvarv,
p on kursor osutile,
n on täisarvu osuti,
[…] on skannitud märkide massiiv, näiteks .
Viimasel juhul sisestatakse sisendvoost ainult nurksulgudes olevad märgid. Kui esimene märk nurksulgudes on '^', sisestatakse ainult need märgid, mida massiiv ei sisalda. Massiivis olevate märkide vahemik määratakse märgiga "-". Tähemärkide sisestamisel sisestatakse ka eesmised tühjad märgid ja stringi lõpetav nullbait.
Modifikaatorid võivad võtta järgmisi väärtusi:
h on lühike täisarv,
l, L – pikk täisarv või ujuk,
ja neid kasutatakse ainult täisarvude või ujukite jaoks.
Järgmine näide näitab funktsiooni scanf kasutusjuhtumeid. Pange tähele, et vormingu määrajale eelneb enne ujuvarvu sisestamist tühik.
#kaasa
printf("Sisestage täisarv: ");
scanf("%d", &n);
printf("Sisesta topelt: ");
scanf(" %lf", &d);
printf("Sisestage täht: ");
scanf(" %c", &c);
printf("Sisesta string: ");
scanf("%s", &s);
Pange tähele, et selles programmis lähtestatakse ujukomaarv. Seda tehakse selleks, et kompilaator sisaldaks teeki, mis toetab ujuvate numbritega töötamist. Kui seda ei tehta, ilmneb ujuvarvu sisestamisel käitusajal tõrge.
Konsooli vormindatud väljundi jaoks kasutage funktsiooni
int printf (const char *formaat, ...);
mis tagastab õnnestumise korral väljundühikute arvu ja ebaõnnestumise korral EOF-i. Vormingu parameeter on vormingustring, mis sisaldab väljundvormingu spetsifikatsioone. Vormingutringile järgnevate argumentide arv ja tüübid peavad vastama vormingustringis antud väljundvormingu spetsifikatsioonide arvule ja tüüpidele. Üldiselt on väljundvormingu spetsifikatsioon järgmine:
%[lipud] [laius] [.täpsus] [muutjad] tüüp
- "lipud" on erinevad sümbolid, mis määravad väljundvormingu;
- "laius" määrab selle spetsifikatsiooniga väljastatavate märkide minimaalse arvu;
- ".precision" määrab maksimaalse väljastatavate märkide arvu;
- "muutjad" määravad argumentide tüübi;
- 'tüüp' määrab argumendi tüübi.
Märgiga täisarvude printimiseks kasutatakse järgmist väljundvormingut:
%[-] [+ | tühik] [laius] [l] d
- – joondus vasakule, vaikimisi – paremale;
+ - kuvatakse märk "+", pange tähele, et negatiivsete arvude puhul kuvatakse alati märk "-";
‘tühik’ – märgi asukohal kuvatakse tühik;
d on andmetüüp int.
Märgita täisarvude väljastamiseks kasutatakse järgmist väljundvormingut:
%[-] [#] [laius] [l]
# - kuvab 8 c/c numbrite puhul algset 0 või 16 c/c numbrite algust 0x või 0X,
l – pikk andmetüübi modifikaator;
u on täisarv vahemikus 10c/c,
o on täisarv väärtuses 8 c/c,
x, X on täisarv 16 c/c.
Ujukomanumbrite kuvamiseks kasutatakse järgmist väljundvormingut:
%[-] [+ | tühik] [laius] [.täpsus]
"täpsus" viitab f-, e- ja E-vormingus numbrite arvule pärast koma või g- ja G-vormingus oluliste numbrite arvule. Numbrid ümardatakse. Vaikimisi on kuue kümnendkoha täpsus;
f on fikseeritud punktiga arv,
e on eksponentsiaalses vormis arv, eksponenti tähistatakse tähega "e",
E on eksponentsiaalses vormis arv, eksponenti tähistatakse tähega "E",
g on f või g vormingutest lühim,
G on f- või G-vormingust lühim.
printf ("n = %d\n f = %f\n e = %e\n E = %E\n f = %.2f", -123, 12,34, 12,34, 12,34, 12,34);
// prindib: n = 123 f = 12,340000 e = 1,234000e+001 E = 1,234000E+001 f = 12,34
1.4. Stringi vormindamine.
Funktsioonide scanf ja printf on olemas variandid, mis on mõeldud stringide vormindamiseks ja mida nimetatakse vastavalt sscanf ja sprintf.
int sscanf (const char *str, const char *vorming, ...);
loeb andmeid str parameetriga määratud stringist vastavalt vorminguparameetriga määratud vormingustringile. Tagastab õnnestumise ja ebaõnnestumise korral loetud andmete hulga. Näiteks,
#kaasa
char str = "a 10 1,2 String Sisend puudub";
sscanf(str, "%c %d %lf %s", &c, &n, &d, s);
printf("%c\n", c); // prindib: a
printf("%d\n", n); // väljatrükke: 10
printf("%f\n", d); // väljatrükke: 1.200000
printf("%s\n", s); // prindib: String
int sprintf (char *puhver, const char *vorming, ...);
vormindab stringi vormingu parameetriga määratud vormingu järgi ja kirjutab tulemuse puhvri märgimassiivi. Funktsioon tagastab puhvri märgimassiivi kirjutatud märkide arvu, välja arvatud lõpetav nullbait. Näiteks,
#kaasa
char str = "c = %c, n = %d, d = %f, s = %s";
char s = "See on string.";
sprintf(puhver, str, c, n, d, s);
printf("%s\n", puhver); // prindib: c = c, n = 10, d = 1,200000, s = See on string
1.5. Teisendage stringid arvandmeteks.
Stringide arvandmeteks teisendamise funktsioonide prototüübid on toodud päisefailis stdlib.h, mis tuleb programmi kaasata.
Stringi täisarvuks teisendamiseks kasutage funktsiooni
int atoi (const char *str);
char *str = "-123";
n = atoi(str); // n = -123
Stringi pikaks täisarvuks teisendamiseks kasutage funktsiooni
pikk int atol (const char *str);
mis õnnestumise korral tagastab täisarvu, milleks string str teisendati, ja 0, kui see ei õnnestu. Näiteks
char *str = "-123";
n = atol(str); // n = -123
Stringi kahekordseks teisendamiseks kasutage funktsiooni
double atof (const char *str);
mis õnnestumise korral tagastab ujuvarvu double tüüpi, milleks string str teisendatakse ja ebaõnnestumise korral 0. Näiteks
char *str = "-123,321";
n = atof(str); // n = -123,321
Järgmised funktsioonid täidavad sarnaseid toiminguid nagu atoi, atol, atof, kuid pakuvad rohkem funktsioone.
long int strtol (const char *str, char **endptr, int base);
teisendab stringi stringi pikaks int-ks, mille ta tagastab. Selle funktsiooni parameetritel on järgmine eesmärk.
Kui baasargument on 0, sõltub teisendus str-i kahest esimesest tähemärgist:
Kui esimene märk on number 1 kuni 9, siis eeldatakse, et see arv on 10 c/c;
Kui esimene märk on arv 0 ja teine märk on arv vahemikus 1 kuni 7, siis eeldatakse, et see arv on 8 c/c;
Kui esimene märk on 0 ja teine märk on 'X' või 'x', siis eeldatakse, et see arv on esitatud 16 c/c.
Kui põhiargumendiks on arv vahemikus 2 kuni 36, võetakse see väärtus arvusüsteemi aluseks ja iga märk, mis läheb sellest süsteemist kaugemale, peatab teisenduse. Numbrisüsteemides alustega 11 kuni 36 kasutatakse numbrite tähistamiseks sümboleid "A" kuni "Z" või "a" kuni "z".
Endptr argumendi väärtuse määrab funktsioon strtol. See väärtus sisaldab kursorit tähemärgile, mis peatas str-i teisendamise. Funktsioon strtol tagastab õnnestumise korral teisendatud arvu ja ebaõnnestumise korral 0. Näiteks
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, peatus = 7
märgita pikk int strtol (const char *str, char **endptr, int alus);
töötab sarnaselt funktsiooniga strtol, kuid teisendab arvu märgiesituse märgita pikaks int-iks.
double strtod (const char *str, char **endptr);
teisendab arvu sümboolse esituse kahekordseks.
Kõik selles lõigus loetletud funktsioonid peatavad oma töö, kui nad kohtavad esimest märki, mis ei sobi kõnealuse numbri vormingusse.
Lisaks, kui numbri märgi väärtus ületab vastava andmetüübi lubatud väärtuste vahemikku, seavad funktsioonid atof, strtol, strtoul, strtod muutuja errno väärtuseks ERANGE. Muutuja errno ja konstant ERANGE on määratletud päisefailis math.h. Funktsioonid atof ja strtod tagastavad HUGE_VAL, funktsioon strtol tagastab LONG_MAX või LONG_MIN ja funktsioon strtoul ULONG_MAX.
Mittestandardseid funktsioone itoa, ltoa, utoa, ecvt, fcvt ja gcvt saab kasutada arvandmete teisendamiseks märgistringideks. Kuid nendel eesmärkidel on parem kasutada standardset sprintf-funktsiooni.
1.6. Standardfunktsioonid stringidega töötamiseks.
Selles jaotises käsitletakse stringidega töötamise funktsioone, mille prototüüpe kirjeldatakse päisefailis string.h.
1. Stringi võrdlus. Stringide võrdlemiseks kasutatakse strcmp ja strncmp funktsioone.
int strcmp (const char *str1, const char *str2);
võrdleb stringe str1, str2 leksikograafiliselt ja tagastab -1, 0 või 1, kui str1 on vastavalt väiksem, võrdne või suurem kui str2.
int strncmp (const char *str1, const char *str2, size_t n);
võrdleb leksikograafiliselt maksimaalselt str1 ja str2 esimest n märki. Funktsioon tagastab väärtuse -1, 0 või 1, kui str1 esimest n märki on vastavalt väiksemad, võrdsed või suuremad kui str2 esimesed n tähemärki.
// stringi võrdlusnäide
#kaasa
#kaasa
char str1 = "aa bb";
char str2 = "aa aa";
char str3 = "aa bb cc";
printf("%d\n", strcmp(str1, str3)); // prindib: -1
printf("%d\n", strcmp(str1, str1)); // prindib: -0
printf("%d\n", strcmp(str1, str2)); // prindib: 1
printf("%d\n", strncmp(str1, str3, 5)); // prindib: 0
2. Ridade kopeerimine. Strcpy ja strncpy funktsioone kasutatakse stringide kopeerimiseks.
char *strcpy (char *str1, const char *str2);
kopeerib stringi str2 stringi str1. String str2 kopeeritakse tervikuna, kaasa arvatud lõpetav nullbait. Funktsioon tagastab kursori str1-le. Kui jooned kattuvad, on tulemus ettearvamatu.
char *strncpy (char *str1, const char *str2, suurus_t n);
kopeerib n tähemärki stringist str2 stringi str1. Kui string str2 sisaldab vähem kui n tähemärki, kopeeritakse viimane nullbait nii palju kordi, kui on vaja stringi str2 laiendamiseks n märgini. Funktsioon tagastab osuti stringile str1.
char str2 = "Kopeeri string.";
strcpy(str1, str2);
printf(str1); // prindib: kopeeri string.
4. Ühendusnöörid. Strcat ja strncat funktsioone kasutatakse stringide ühendamiseks üheks stringiks.
char* strcat (char *str1, const char *str2);
lisab stringile str1 stringi str2, kusjuures stringi str1 lõpetav nullbait kustutatakse. Funktsioon tagastab osuti stringile str1.
char* strncat (char *str1, const char *str2, suurus_t n);
ühendab n tähemärki stringist str2 stringi str1, kustutades str1 lõpu nullbaidi. Funktsioon tagastab osuti stringile str1. kui stringi str2 pikkus on väiksem kui n, siis lisatakse ainult stringis str2 sisalduvad märgid. Pärast stringi ühendamist lisatakse str1-le alati nullbait. Funktsioon tagastab osuti stringile str1.
#kaasa
#kaasa
char str1 = "string";
char str2 = "katenatsioon";
char str3 = "Jah Ei";
strcat(str1, str2);
printf("%s\n", str1); // prindib: String catenation
strncat(str1, str3, 3);
printf("%s\n", str1); // prindib: String catenation Jah
5. Otsige stringist märki. Funktsioone strchr, strrchr, strspn, strcspn ja strpbrk kasutatakse stringist märgi otsimiseks.
char* strchr (const char *str, int c);
otsib stringist str parameetriga c määratud märgi esimest esinemist. Edu korral tagastab funktsioon kursori esimesele leitud märgile ja ebaõnnestumise korral NULL.
char* strrchr (const char *str, int c);
otsib stringis stringis parameetriga c määratud märgi viimast esinemist. Edu korral tagastab funktsioon kursori viimati leitud märgile ja ebaõnnestumise korral NULL.
#kaasa
#kaasa
char str = "täheotsing";
printf("%s\n", strchr(str, "r")); // prindib: r otsing
printf("%s\n", strrchr(str, "r")); // prindib: rch
suurus_t strspn (const char *str1, const char *str2);
tagastab str1 esimese märgi indeksi, mida str2-s ei ole.
suurus_t strcspn (const char *str1, const char *str2);
tagastab str1 esimese märgi indeksi, mis on str2-s.
char str = "123 abc";
printf("n = %d\n", strspn(str, "321"); // prindib: n = 3
printf ("n = %d\n", strcspn (str, "cba"); // prindib: n = 4
char* strpbrk (const char *str1, const char *str2);
leiab str1 esimese märgi, mis võrdub ühe tähemärgiga str2-s. Edu korral tagastab funktsioon kursori sellele märgile ja ebaõnnestumise korral NULL.
char str = "123 abc";
printf("%s\n", strpbrk(str, "bca")); // prindib: abc
6. Stringide võrdlus. Stringide võrdlemiseks kasutatakse funktsiooni strstr.
char* strstr (const char *str1, const char *str2);
leiab stringi str2 esimese esinemiskoha (ilma lõpu nullbaidita) stringis str1. Edu korral tagastab funktsioon kursori leitud alamstringile ja ebaõnnestumise korral NULL. Kui str1 osuti osutab nullpikkusele stringile, tagastab funktsioon str1 osuti.
char str = "123 abc 456;
printf("%s\n", strstr(str, "abc"); // print: abc 456
7. Stringi parsimine märkideks. Strtok funktsiooni kasutatakse stringi märkideks sõelumiseks.
char* strtok (char *str1, const char *str2);
tagastab kursori stringis str1 järgmisele märgile (sõnale), kus märgi eraldajad on stringi str2 märgid. Kui märgid on möödas, tagastab funktsioon NULL. Funktsiooni strtok esimesel väljakutsel peab parameeter str1 osutama stringile, mis sõelutakse žetoonidena, ja järgmistel kõnedel tuleb selle parameetri väärtuseks määrata NULL. Pärast märgi leidmist kirjutab funktsioon strtok selle märgi järele eraldaja asemel nullbaidi.
#kaasa
#kaasa
char str = "12 34 ab cd";
p = strtok(str, " ");
printf("%s\n",p); // prindib väärtused veerus: 12 34 ab cd
p = strtok(NULL, " ");
8. Stringi pikkuse määramine. Strlen funktsiooni kasutatakse stringi pikkuse määramiseks.
suurus_t strlen(const char *str);
tagastab stringi pikkuse, ignoreerides viimast nullbaiti. Näiteks,
char str = "123";
printf("len = %d\n",strlen(str)); // prindib: len = 3
1.7. Funktsioonid mäluga töötamiseks.
Päisefailis string.h on kirjeldatud ka mäluplokkidega töötamise funktsioone, mis on sarnased vastavate stringidega töötamise funktsioonidega.
void* memchr(const void *str, int c, suurus_t n);
otsib c-ga määratud märgi esimest esinemist str n baidist.
int memcmp(const void *str1, const void *str2, suurus_t n);
võrdleb stringide str1 ja str2 esimest n baiti.
void* memcpy(const void *str1, const void *str2, suurus_t n);
kopeerib esimesed n baiti stringist str1 stringi str2.
void* memmove(const void *str1, const void *str2, suurus_t n);
kopeerib esimesed n baiti str1-st str2-sse, tagades, et kattuvaid stringe käsitletakse õigesti.
void* memset(const void *str, int c, suurus_t n);
kopeerib c-ga määratud märgi str-i esimesse n baiti.
Kaasaegne C++ standard defineerib stringidega töö korraldamiseks funktsioonide ja omadustega (muutujatega) klassi (klassikalises C-keeles stringe kui selliseid pole, on ainult tähemassiivid):
#kaasa
#kaasa#kaasa
Stringidega töötamiseks peate lisama ka standardse nimeruumi:
Nimeruumi kasutamine std;
Vastasel juhul peate igal pool stringi asemel määrama klassi deskriptori std::string.
Järgmine on näide programmist, mis töötab stringiga (ei tööta vanades C-ühilduvates kompilaatorites!):
#kaasa
Stringiklassi peamised omadused:
- initsialiseerimine märkide massiiviga (sisseehitatud string) või muu string tüüpi objektiga. Sisseehitatud tüübil pole teist võimalust;
- ühe rea teise kopeerimine. Sisseehitatud tüübi jaoks peate kasutama funktsiooni strcpy();
- juurdepääs stringi üksikutele tähemärkidele lugemiseks ja kirjutamiseks. Sisseehitatud massiivi puhul kasutatakse seda indeksioperatsiooni või kaudse adresseerimise abil kursori abil;
- kahe stringi võrdlemine võrdsuse jaoks. Sisseehitatud tüübi puhul kasutatakse strcmp() perekonna funktsioone;
- kahe stringi ühendamine (konkateneerimine), andes tulemuse kas kolmanda stringina või ühe algse stringina. Sisseehitatud tüübi puhul kasutatakse funktsiooni strcat(), kuid tulemuse saamiseks uuele reale tuleb kasutada järjestuses funktsioone strcpy() ja strcat() ning hoolitseda ka mälu eraldamise eest;
- sisseehitatud vahendid stringi pikkuse määramiseks (klassi suurus() ja l ength() liikmefunktsioonid. Ainus viis sisseehitatud tüüpi stringi pikkust teada saada on selle arvutamine funktsiooniga strlen();
- võimalus teada saada, kas string on tühi.
Vaatame neid põhifunktsioone lähemalt.
Stringi lähtestamine kirjeldamisel ja nööri pikkus(välja arvatud lõpetav nullterminaator):
String st("Minu string\n"); cout<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";
String võib olla ka tühi:
String st2;
Et kontrollida, kas kas string on tühi, saate selle pikkust võrrelda 0-ga:
if (!st.size()) // tühi
või kasutage meetodit empty(), mis tagastab tühja stringi puhul tõene ja mittetühja stringi puhul false:
if (st.empty()) // tühi
Kolmas stringi loomise vorm initsialiseerib stringi tüüpi objekti teise sama tüüpi objektiga:
String st3(st);
String st3 initsialiseeritakse stringiga st . Kuidas saame tagada, et need stringid sobivad? Kasutame võrdlusoperaatorit (==):
Kui (st == st3) // lähtestamine õnnestus
Kuidas kopeerida üks rida teisele? Tavalise määramisoperaatoriga:
st2 = st3; // kopeeri st3 st2
Sest stringide ühendamine kasutatakse liitmisoperaatorit (+) või liitmise-määramise operaatorit (+=). Olgu antud kaks rida:
String s1("tere, "); string s2("maailm\n");
Saame kolmanda stringi, mis koosneb kahe esimese konkatenatsioonist, seega:
String s3 = s1 + s2;
Kui tahame s1 lõppu lisada s2, peame kirjutama:
S1 += s2;
Liitmisoperatsioon võib klassiobjekte liita string mitte ainult omavahel, vaid ka sisseehitatud tüüpi stringidega. Saate ülaltoodud näite ümber kirjutada nii, et erimärke ja kirjavahemärke esindab sisseehitatud tüüp char * ja olulisi sõnu klassistringi objektid:
Const char *pc = ", "; string s1("tere"); string s2("maailm"); string s3 = s1 + pc + s2 + "\n"; cout<< endl << s3;
Sellised avaldised töötavad, kuna kompilaator "teab", kuidas automaatselt teisendada sisseehitatud tüüpi objekte klassistringi objektideks. Samuti on võimalik stringiobjektile lihtsalt sisseehitatud string määrata:
String s1; const char *pc = "märkide massiiv"; s1=pc; // Õige
Vastupidine teisendus on ei tööta. Järgmise sisseehitatud tüüpi stringi lähtestamise katse põhjustab kompileerimisvea:
Char*str = s1; // koostamise viga
Selle teisenduse tegemiseks peate selgelt kutsuma liikmefunktsiooni nimega c_str() ("C string"):
Const char *str = s1.c_str();
Funktsioon c_str() tagastab kursori märgimassiivile, mis sisaldab stringiobjekti stringi, nagu see oleks sisseehitatud stringitüübi puhul. Märksõna const takistab tänapäevastes visuaalsetes keskkondades "ohtlikku" võimalust objekti sisu otse kursori abil muuta.
TO üksikud tegelased tüübiga string objektile, nagu ka sisseehitatud tüübile, pääseb juurde indeksoperatsiooni abil. Näiteks siin on koodilõik, mis asendab kõik punktid allkriipsudega:
String str("www.disney.com"); int suurus = str.size(); jaoks (int i = 0; i< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;
Asenda(str.begin(), str.end(), ".", "_");
Tõsi, siin ei kasutata mitte stringiklassi asendusmeetodit, vaid samanimelist algoritmi:
#kaasa
Kuna stringobjekt käitub nagu konteiner, saab sellele rakendada muid algoritme. See võimaldab lahendada probleeme, mida stringiklassi funktsioonid otseselt ei lahenda.
Allpool on lühikirjeldus stringiklassi peamistest operaatoritest ja funktsioonidest, tabelis olevad lingid viivad venekeelsete kirjeldusteni Internetis. Stringiklassi võimaluste täielikuma loetelu leiate näiteks Wikipediast või cplusplus.com-ist.
Tähemärkide määramine stringis |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operaator= |
määrab stringile väärtused |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
määrama |
määrab stringile märgid |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Juurdepääs üksikutele tegelastele |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
juures |
määratud märgi hankimine koos indeksi kontrollimisega piiridest väljas |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operaator |
määratud tähemärgi saamine |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ees |
esimese tegelase saamine |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tagasi |
viimase tegelase saamine |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
andmeid |
tagastab kursori stringi esimesele märgile |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c_str |
naaseb muutmatu C-märkide massiiv, mis sisaldab stringi märke |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Stringi mahu kontrollimine |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tühi |
kontrollib, kas string on tühi |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
suurus |
tagastab märkide arvu stringis |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
max_size |
tagastab maksimaalse märkide arvu |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
reserv |
reserveerib hoiuruumi |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tehted stringil |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
selge |
tühjendab stringi sisu |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
sisestada |
märgi sisestamine |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
kustutada |
tegelase eemaldamine |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lükka tagasi |
tähemärgi lisamine stringi lõppu |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pop_back |
eemaldab viimase tähemärgi |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lisama |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
operaator+= |
lisab tähemärgid stringi lõppu |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
võrdlema |
võrdleb kahte stringi |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
asendada |
asendab määratud märgi iga esinemise |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
alamstr |
tagastab alamstringi |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
kopeerida |
kopeerib tegelasi |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
suurust muutma |
muudab salvestatud märkide arvu |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StringideklaratsioonidString C-keeles on ühemõõtmeline märkide massiiv, mille viimane element on rea lõpu märk - null (null-lõpuline string, see tähendab NULL-lõpuga string). String-tüüpi muutuja C-s deklareerimiseks on kolm võimalust, millest kaks initsialiseerivad stringi deklareerimise ajal. Esimene viis:Märgimassiivi deklaratsioonid (ärge unustage lõpetava nulli jaoks tühikut lisada): Tähed; Teine viis:Määrake stringi muutujale algväärtus (sel juhul saab kompilaator stringi pikkuse ise arvutada): Char s = "Stringi lähtestamise näide"; Määramismärgist paremal on stringi konstant. Stringi lõppu lisatakse automaatselt null ('\0'). Märgistringi konstandid paigutatakse staatilisse salvestusklassi. Kolmas viis:Kaudne märge, et massiivi kasutatakse. Määramismärgi vasakul küljel on kursor sümbolile: Char *s="Teine lähtestamise valik"; Muutuja s osutab RAM-i asukohale, kus stringikonstant asub. Sellel tähistusvormil on potentsiaalne viga, kuna märgile osutavat osutit nimetatakse sageli stringiks. Allolev kirje on lihtsalt kursor märgile, kuna stringi jaoks pole ruumi: Char*s; Stringi sisestamine standardsest sisendseadmest (klaviatuurist)Stringidega töötamiseks on funktsioonide komplekt. Tavalisest sisendseadmest (klaviatuurist) sisestamiseks kasutatakse kõige sagedamini standardse sisend-/väljundmooduli raamatukogu funktsioone: scanf Ja saab. Stringi sisestamiseks funktsiooni abil scanf, kasutab vormingut « %s» , ja pange tähele, et aadressimärki ei kasutata enne rea identifikaatorit « & » , kuna ühemõõtmelist massiivi kujutab juba kursor selle algusesse: scanf("%s", s); Funktsioon saab () loeb märke, kuni jõuab reavahetuseni. Funktsioon aktsepteerib kõiki märke kuni reavahetuse märgini, kuid mitte. Stringi lõppu lisatakse lõpetav null ('\0'). Funktsioon saab () paneb klaviatuurilt loetud tähemärkide jada stringiparameetrisse ja tagastab kursori sellele stringile (kui toiming oli edukas) või NULL (vea korral). Allolevas näites kuvatakse pärast toimingu edukat lõpetamist ekraanil kaks identset rida: #kaasa Möödaminnes märgime, et funktsiooni gets kasutatakse sageli klaviatuurilt mis tahes andmete sisestamiseks stringina, et sscanf-funktsiooni edasiseks teisendamiseks soovitud vormingusse või sisendandmete eelanalüüsiks, näiteks: #kaasa Stringide printimine standardväljundisse (monitori ekraan)Stringide väljastamiseks standardväljundisse (monitoriekraan) saate kasutada kahte funktsiooni printf Ja paneb. Funktsioonis printf edastatakse vorminguks "%s". Selle funktsiooni kasutamise mugavus seisneb selles, et lisaks stringile saate kohe kuvada ka muud tüüpi andmeid. funktsiooni funktsioon paneb on see, et pärast rea väljastamist toimub automaatselt üleminek järgmisele reale. Stringi funktsioonidStringide teisendamiseks C-keeles on stringiteek. Igal funktsioonil on oma salvestusvorming (prototüüp). Selles artiklis käsitletakse enim kasutatud funktsioone. - lugeda Stringidega töötavate programmide (loetelu) näide 34--- C# õpetus --- Stringid Tavalise programmeerimise osas string stringi andmetüüp on C#-s üks olulisemaid. See tüüp määratleb ja toetab märgistringe. Paljudes teistes programmeerimiskeeltes on string märkide massiiv. Ja C#-s on stringid objektid. Seetõttu on stringitüüp üks viitetüüpidest. Rea ehitusLihtsaim viis märgistringi konstrueerimiseks on kasutada stringiliteraali. Näiteks järgmises koodireas omistatakse stringi viitemuutujale str viide stringiliteraalile: String str = "Näidiste string"; Sel juhul initsialiseeritakse muutuja str märgijadaga "Example String". Stringi tüüpi objekti saab luua ka char tüüpi massiivist. Näiteks: Char chararray = ("e", "x", "a", "m", "p", "l", "e"); string str = uus string(chararray); Kui stringi tüüpi objekt on loodud, saab seda kasutada kõikjal, kus on vaja tsiteeritud teksti stringi. Stringi püsivusKummalisel kombel ei saa stringi tüüpi objekti sisu muuta. See tähendab, et kui märgijada on loodud, ei saa seda muuta. Kuid see piirang aitab kaasa märgistringide tõhusamale rakendamisele. Seetõttu muutub see esmapilgul ilmne puudus tegelikult eeliseks. Seega, kui vajate stringi olemasoleva stringi variatsioonina, peaksite selleks looma uue stringi, mis sisaldab kõiki vajalikke muudatusi. Ja kuna kasutamata stringobjektid kogutakse automaatselt "prügisse", siis ei pea te isegi muretsema mittevajalike stringide saatuse pärast. Siiski tuleb rõhutada, et stringi viitemuutujad (st stringi tüüpi objektid) võivad muutuda ja seetõttu võivad nad viidata teisele objektile. Kuid stringobjekti enda sisu ei muutu pärast selle loomist. Kaaluge näidet: Staatiline void addNewString() ( string s = "See on minu tõmme"; s = "See on uus tõmme"; ) Kompileerime rakenduse ja laadime saadud koostu ildasm.exe utiliiti. Joonisel on näidatud CIL-kood, mis genereeritakse meetodi void addNewString() jaoks: Pange tähele mitut kõnet opkoodile ldstr (stringi koormus). See ldstr opkood CIL-is põhjustab uue stringiobjekti laadimise hallatavasse hunnikusse. Selle tulemusena kogutakse lõpuks prügi ära eelmine objekt, mis sisaldas väärtust "See on minu löök". Stringidega töötamineKlassis Süsteem.String on ette nähtud meetodite komplekt märgiandmete pikkuse määramiseks, aktiivse stringi alamstringi otsimiseks, märkide teisendamiseks suurtähtedest väiketähtedeks ja vastupidi jne. Järgmisena vaatame seda klassi üksikasjalikumalt. String-klassi väli, indekseerija ja omadusKlassil String on määratletud üks väli: Avalik staatiline kirjutuskaitstud string Tühi; Väli Empty tähistab tühja stringi, st. string, mis ei sisalda märke. See erineb tühjast stringi viitest, mis tehakse lihtsalt olematule objektile. Lisaks määratleb klass String ühe kirjutuskaitstud indekseerija: Selle avalik märk ( hankige; ) See indekseerija võimaldab teil saada määratud indeksiga märgi. Stringide indekseerimine, nagu massiivid, algab nullist. Stringiobjektid on püsivad ega muutu, seega on mõistlik, et klass String toetab kirjutuskaitstud indekseerijat. Lõpuks määratleb klass String ühe kirjutuskaitstud atribuudi: Avalik int Pikkus ( saada; ) Atribuut Length tagastab märkide arvu stringis. Allolev näide näitab indekseerija ja atribuudi Length kasutamist: Süsteemi kasutamine; class Näide ( static void Main() ( string str = "Lihtne string"; // Stringi pikkuse ja stringi kuuenda märgi hankimine indekseerijaga Console.WriteLine("Stringi pikkus on (0), 6. märk on "(1)"" , str.Length, str); ) ) Stringiklassi operaatoridKlass String koormab üle kahte järgmist operaatorit: == ja !=. Operaatorit == kasutatakse kahe märgistringi võrdsuse testimiseks. Kui objektiviidetele rakendatakse operaatorit ==, kontrollib see tavaliselt, kas mõlemad viited on samale objektile. Ja kui operaatorit == rakendatakse objektiviidetele, mis on tüüpi String, võrreldakse stringide endi sisu võrdsuse tagamiseks. Sama kehtib ka operaatori != kohta. Kui seda rakendatakse String tüüpi objektiviidetele, võrreldakse stringide endi sisu ebavõrdsuse suhtes. Samal ajal võrdlevad teised relatsioonioperaatorid, sealhulgas =, viiteid String-tüüpi objektidele samamoodi nagu muud tüüpi objektidele. Ja selleks, et kontrollida, kas üks string on teisest suurem, tuleks kutsuda String klassis määratletud meetod Compare(). Nagu hiljem selgub, kasutavad mitmesugused märgistringide võrdlused kultuuriteavet. Kuid see ei kehti == ja != operaatorite kohta. Lõppude lõpuks võrdlevad nad lihtsalt märkide järjekorraväärtusi stringides. (Teisisõnu, nad võrdlevad kahendmärkide väärtusi, mida kultuurinormid ei ole muutnud, st lokaate.) Seetõttu teostavad need operaatorid stringide võrdlusi tõstu- ja kultuuri mittetundlikul viisil. Stringiklassi meetodidJärgmises tabelis on loetletud mõned selle klassi huvitavamad meetodid, mis on rühmitatud eesmärgi järgi:
Järgmises programminäites kasutatakse mitut ülaltoodud meetoditest. Süsteemi kasutamine; kasutades System.Collections.Generic; kasutades System.Linq; kasutades System.Text; nimeruum ConsoleApplication1 ( klass Program ( staatiline void Main(string args) ( // Võrdle kahte esimest stringi string s1 = "see on string"; string s2 = "see on tekst, see on string"); if (String.CompareOrdinal (s1, s2) != 0) Console.WriteLine("Stringid s1 ja s2 ei ole võrdsed"); if (String.Compare(s1, 0, s2, 13, 10, true) == 0) Console.WriteLine( "Kuid need sisaldavad sama teksti"); // Stringi ühendamine Console.WriteLine(String.Concat("\n" + "One, two ","three, four")); // Otsi stringist // Esimene esinemine of substring if (s2. IndexOf("this") != -1) Console.WriteLine("Realt leiti sõna \"this\", see on "+ "at: (0) positsioonil", s2. IndexOf("this")); / / Alamstringi viimane esinemine if (s2.LastIndexOf("this") != -1) Console.WriteLine("Selle \"viimane esinemine\" on " + "kohal ( 0) position", s2.LastIndexOf("this" )); // Otsige tähemärkide massiivist char myCh = ("S","x","t"); if (s2.IndexOfAny(myCh) != -1) Console.WriteLine("Üks tähemärki massiivist ch "+ "leitud praeguselt realt positsioonilt (0)", s2.IndexOfAny(myCh)); // Määrab, kas string algab antud alamstringiga if (s2.StartsWith("see on tekst") == true) Console.WriteLine("Alamstring leitud!"); // Määrake, kas string sisaldab alamstringi // kasutades kasutaja operatsioonisüsteemi stringi määramise näidet myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Teie operatsioonisüsteem on Windows XP"); else if (myOS.Contains("NT 6.1")) Console.WriteLine("Teie operatsioonisüsteem on Windows 7"); Console.ReadLine(); ) ) ) Natuke stringide võrdlusest C#-sKõigist märgistringi töötlemistoimingutest on see tõenäoliselt kõige sagedamini teostatav ühe stringi võrdlemine teisega. Enne stringide võrdlusmeetodite vaatamist tuleks rõhutada järgmist: stringide võrdlemist saab .NET Frameworkis teha peamiselt kahel viisil. Esiteks võib võrdlus kajastada konkreetse kultuurikeskkonna tavasid ja norme, mis on sageli kultuurilised seaded, mis jõustuvad programmi täitmisel. See on mõne, kuigi mitte kõigi võrdlusmeetodite standardkäitumine. Ja teiseks saab võrdlust teostada sõltumata kultuurikeskkonna seadistustest ainult stringi moodustavate tegelaste järguväärtuste põhjal. Üldiselt kasutab stringide kultuuriliselt mittetundlik võrdlemine leksikograafilist järjekorda (ja keelelisi tunnuseid), et teha kindlaks, kas üks string on suurem, väiksem või võrdne teisest stringist. Järkjärgulises võrdluses järjestatakse stringid lihtsalt iga tähemärgi muutmata väärtuse alusel. Kultuuride ja järguliste võrdluste stringide võrdlemise ja iga sellise võrdluse mõju tõttu soovitame tungivalt kasutada Microsofti praegu pakutavaid parimaid tavasid. Lõppkokkuvõttes võib stringide võrdlemiseks vale meetodi valimine kaasa tuua programmi ebaõige töö, kui seda kasutatakse keskkonnas, mis erineb sellest, milles see välja töötati. Tähemärkide jadade võrdlemise valik on väga oluline otsus. Üldreeglina ja eranditult peaksite valima kultuuriliselt tundliku stringivõrdluse, kui selle eesmärk on kasutajale tulemuse kuvamine (näiteks leksikograafilises järjekorras sorteeritud stringide seeria kuvamiseks). Kui aga stringid sisaldavad fikseeritud teavet, mida ei ole ette nähtud kultuuriliste erinevuste jaoks muutmiseks, nagu failinimi, märksõna, veebisaidi aadress või turvalisusega seotud väärtus, peaksite valima järgulise stringi võrdluse. Loomulikult määravad konkreetse arendatava rakenduse eripärad märgistringide võrdlemiseks sobiva viisi valiku. Klass String pakub mitmesuguseid stringide võrdlusmeetodeid, mis on loetletud ülaltoodud tabelis. Kõige mitmekülgsem neist on meetod Compare (). See võimaldab teil võrrelda kahte stringi täielikult või osaliselt, kas tõstutundlikke või tõstutundlikke, tüübiparameetriga määratud võrdluse viisil StringComparison, samuti tüübiparameetri pakutavat kultuuriteavet Kultuuriinfo. Need meetodi Compare() ülekoormused, mis ei sisalda StringComparisoni tüüpi parameetrit, viivad läbi märgistringide tõstu- ja kultuuritundliku võrdluse. Ja nendes ülekoormatud variantides, mis ei sisalda CultureInfo tüüpi parameetrit, määrab kultuuriteabe praegune käituskeskkond. Tüüp StringComparison on loend, mis määratleb allolevas tabelis näidatud väärtused. Neid väärtusi kasutades saate korraldada stringide võrdlusi, mis vastavad teie rakenduse vajadustele. Seetõttu laiendab StringComparison-tüüpi parameetri lisamine meetodi Compare() ja teiste võrdlusmeetodite (nt Equals() võimalusi. Samuti võimaldab see üheselt määrata, kuidas stringe võrrelda. Kultuuritundlike stringide võrdluste ja järguliste võrdluste erinevuste tõttu on oluline olla selles osas võimalikult täpne.
Mõlemal juhul tagastab meetod Compare() negatiivse väärtuse, kui esimene võrreldav string on teisest väiksem; positiivne väärtus, kui esimene võrreldav string on suurem kui teine; ja lõpuks null, kui mõlemad võrreldavad stringid on võrdsed. Kuigi meetod Compare() tagastab nulli, kui võrreldavad stringid on võrdsed, on üldiselt parem kasutada meetodit Equals() või operaatorit ==, et teha kindlaks, kas märgistringid on võrdsed. Fakt on see, et meetod Compare() määrab võrreldavate stringide võrdsuse nende sortimisjärjestuse alusel. Näiteks kui stringe võrreldakse kultuuriliselt, võivad mõlemad stringid oma sortimisjärjekorras olla samad, kuid mitte sisuliselt võrdsed. Vaikimisi määratakse stringide võrdsus meetodi Equals() abil, mis põhineb märkide järguväärtustel, mitte kultuuriliselt. Seetõttu võrreldakse selles meetodis vaikimisi mõlemat stringi absoluutse märgihaaval võrdsuse saamiseks, sarnaselt sellele, kuidas seda tehakse operaatori == puhul. Vaatamata meetodi Compare() suurele mitmekülgsusele on märgistringide lihtsaks järguliseks võrdlemiseks lihtsam kasutada CompareOrdinal() meetodit. Lõpuks pidage meeles, et CompareTo() meetod võrdleb stringe ainult kultuuriliselt tundlikul viisil. Järgmine programm demonstreerib meetodite Compare(), Equals(), CompareOrdinal() ning operaatorite == ja != kasutamist märgistringide võrdlemiseks. Pange tähele, et kaks esimest võrdlusnäidet näitavad selgelt erinevusi kultuuriliselt tundlike stringide võrdluste ja ingliskeelsete järgarvude võrdluste vahel: Süsteemi kasutamine; class Näide ( staatiline void Main() ( string str1 = "alfa"; string str2 = "alfa"; string str3 = "beeta"; string str4 = "alfa"; string str5 = "alfa, beeta"; int tulemus; / / Esiteks demonstreerige erinevusi kultuuritundliku stringide võrdluse ja järgu võrdlemise tulemuse vahel = String.Compare(str1, str2, StringComparison.CurrentCulture); Console.Write("Kultuuritundlik stringide võrdlus: "); if (tulemus 0 ) Console .WriteLine(str1 + " on suurem kui " + str2); else Console.WriteLine(str1 + "on " + str2); result = String.Compare(str1, str2, StringComparison.Ordinal); Console.Write("Järjekordade võrdlus read: "); if (tulemus 0) Console.WriteLine(str1 + " on suurem kui " + str2); else Console.WriteLine(str1 + "on võrdne " + str4); // Kasutage meetodi CompareOrdinal() tulemust = String.CompareOrdinal( str1, str2); Console.Write("Võrdle stringe kasutades CompareOrdinal():\n"); if (tulemus 0) Console.WriteLine(str1 + " on suurem kui " + str2); else Console. WriteLine(str1 + "on võrdne " +str4); Console.WriteLine(); // Stringi võrdsuse määramine operaatori == abil // See on märgistringide järguline võrdlus if (str1 == str4) Console.WriteLine(str1 + " == " + str4); // Rea ebavõrdsuse tuvastamine operaatori != abil if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Console.WriteLine(); // Tehke järgu tõstetundlik stringide võrdlus, kasutades meetodit Equals() if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Stringide võrdlemine Equals() meetodi abil parameetriga OrdinalIgnoreCase : \n" + str1 + " võrdub " + str2); Console.WriteLine(); // Stringide osade võrdlemine if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Stringide võrdlemine praeguse kultuuri alusel:" + "\n3 esimest tähemärki stringi " + str2 + " on suurem kui stringi " + str5" esimesed 3 tähemärki; ) ) ) Selle programmi käivitamine annab järgmise tulemuse: |