p»їBetrouwbaar SEO-bureau India kan de inkomsten van kleine bedrijven verhogen
80% van de gebruikers zoekt op Google en andere zoekmachines voordat ze een aankoop doen en meer dan 50% van de via zoekmachines gegenereerde zoekopdrachten worden geconverteerd. Deze twee statistieken bewijzen het belang van zoekmachineoptimalisatie. Er zijn veel van dergelijke statistieken en feiten die een duidelijk punt maken: elk klein, middelgroot of grootschalig bedrijf heeft professionele SEO-diensten nodig. Kleine bedrijven en startups worden vaak geconfronteerd met budgetproblemen. Ze kunnen de hulp inroepen van elk betrouwbaar SEO-bureau uit India om de beste SEO-service binnen hun budget te krijgen en zo hun inkomsten te verhogen.
Zoeken heeft een grote impact op de geest van consumenten. Volgens de verschillende statistieken die zijn gedeeld door grote experts op het gebied van zoekmachineoptimalisatie op verschillende geautoriseerde websites zoals Search Engine Land, Moz, SEO Journal, Digital Marketers India, Hubspot, enz. SEO vangt een meerderheid van de leads op. Ook hebben de leads afkomstig uit de organische zoekresultaten een hoger conversiepercentage. Deze statistieken en consumentengedrag maken duidelijker dat de beste SEO-service geen luxe is, maar een noodzaak voor elk bedrijf.
Om de concurrentie te omzeilen en de bedrijfsgroei te vergroten, moet elke organisatie de diensten voor zoekmachineoptimalisatie gebruiken. De grote merken kunnen genoeg geld investeren voor de deskundige SEO-service die wordt aangeboden door een top SEO-bedrijf of een SEO-specialist, maar eigenaren van kleine bedrijven doen vaak concessies aan de kwaliteit van deze service vanwege een lager budget. Het is een moeilijk feit dat kleine bedrijven en startups uiteindelijk de kansen laten liggen die kunnen worden gecreëerd met de professionele SEO-service of een goedkope SEO-service gebruiken die geen positieve resultaten oplevert.
Eigenaars van kleine bedrijven en startups kunnen zelfs met een beperkt budget profiteren van professionele SEO-diensten. De beste oplossing is het vinden van een betrouwbaar SEO-bedrijf gevestigd in India. In India zijn er veel SEO-experts die samenwerken met het digitale marketingbureau en de beste diensten in de branche aanbieden. Zij kunnen u de benodigde SEO-diensten leveren binnen uw budget. Over de lonen kan worden onderhandeld met een SEO-bureau India om betere diensten tegen lagere tarieven te krijgen. Val echter niet voor de goedkope SEO-service die minder in rekening brengt en belooft meer te geven, aangezien expertise op zichzelf komt. U moet de portefeuille bekijken of de juiste vragen stellen voordat u een bedrijf voor uw bedrijf inhuurt.
De SEO-experts in India zijn bedreven in de best practices van zoekmachineoptimalisatie. Er zijn ook enkele SEO-specialisten in India, zoals Ash Vyas, die gespecialiseerd zijn in het creëren van de beste zvoor een bedrijf met een bepaald budget. De SEO-professionals zullen een duidelijk plan opstellen en ook delen wat de verwachte resultaten kunnen zijn. Zo bent u goed op de hoogte van uw belegging en rendement. Dit helpt bij het nemen van een betere zakelijke beslissing.
Een goed idee is om zo snel mogelijk een betrouwbaar SEO-bedrijf uit India te vinden en te contracteren dat de beste SEO-diensten aanbiedt. U kunt ook beginnen met een klein budget en beperkte activiteiten om uw webpagina's geïndexeerd te krijgen en uw trefwoorden in zoekmachines een boost te geven. Wacht niet op het perfecte moment of de dag waarop u duizenden dollars heeft om te investeren in de beste SEO-diensten. Vroeg beginnen zal u helpen sneller resultaten te behalen als u agressief te werk kunt gaan met uw marketingaanpak. Een betrouwbaar SEO-bedrijf uit India helpt u bij het definiëren van uw huidige en toekomstige plannen om goede resultaten te behalen. Meer geïndexeerde pagina's zorgen voor een hogere ranking en een geloofwaardig merk van uw bedrijf. Gemaakt met continue professionele SEO-praktijken zal het aantal aanvragen, omzet en inkomsten verdubbelen. Elk klein bedrijf kan beginnen met een investering van twee cijfers in de professionele SEO-diensten. Er zijn veel SEO-bureaus in India die een laag budget aanbieden en toch het resultaat zijn van georiënteerde.
enquêtes uit ballingschap
-
CraigWew
12.04.2018p»їHet belang van het opbouwen van een goede verstandhouding met de klant op het gebied van onroerend goed en algemene verkoop
Het belang van een goede verstandhouding met de klant.
Het opbouwen van een goede verstandhouding met een klant moet worden verdiend en moet worden benaderd als een zeer integraal onderdeel van het verkoopproces.
Om ervoor te zorgen dat een klant en uzelf een echte één-op-één-relatie met elkaar kunnen hebben, zijn er twee dingen nodig!
Eerst moet je op de hoogte zijn en er zijn! Ten tweede moet je begrijpen dat er tijdens dit proces twee verschillende fasen zullen plaatsvinden.
A-Wees erbij, wat betekent dat?
o De meeste mensen luisteren niet echt naar een andere persoon terwijl ze praten. Over het algemeen zijn ze zo druk bezig met het formuleren van hun volgende antwoord of stelling dat ze onmogelijk echt kunnen luisteren.
o Als dit op jou lijkt, betekent aanwezig zijn dat je je mond moet houden en moet luisteren!
B-Wat is de eerste of initiële fase?
o Over het algemeen heeft u slechts een paar minuten de tijd om uzelf in de geest van de klant te vestigen als iemand met wie zij zaken willen doen.
o Bij twijfel is het het beste om eerst vragen te stellen die hen aanspreken en over zichzelf praten.
o Het is ook altijd veilig om als professional over te komen. Ik bedoel niet stoïcijns of droogjes, maar iemand die weet wat hij doet, praat en er goed uitziet.
C-Andere fasen
o Naarmate de tijd verstrijkt, zul je door middel van gesprekken en vragen die ze zullen hebben, je vaardigheden vaststellen of niet.
o Houd er rekening mee dat ze je waarschijnlijk nog een tijdje zullen meten. Het goede nieuws is dat als u succesvol bent in het opbouwen van een goede verstandhouding, ze zich op een gegeven moment zullen ontspannen en u zich kunt concentreren op het vinden of verkopen van het huis.
Wat kan mij nog meer helpen een goede verstandhouding te ontwikkelen?
o Door verschillende persoonlijkheidstypes te proberen begrijpen en vervolgens de juiste vragen te stellen en te stellen.
o Als je een goede verstandhouding hebt (op dezelfde golflengte zit als de klant), dan is de verkoop in principe voorbij, nu is het gewoon een kwestie van het vinden van het juiste huis of het invullen van de aanbiedingspapieren.
Hoe zit het met verschillende persoonlijkheden
o Omdat dit geen boek over psychiatrie is, moeten we nu eerst twee hoofdtypen begrijpen.
o Er zijn introverte en extraverte mensen.
o Je kent het type. Bedenk drie mensen die je kent die in elke classificatie passen.
Hoe zit het met lichaamstaal en spraakpatronen?
o Als ze snel of langzaam praten, probeer dan hun spraakpatronen na te bootsen.
o Als ze luid of zacht praten, doe dan hetzelfde. Leunen ze naar voren of naar achteren?
o Het is onnodig om te zeggen dat er veel boeken over dit onderwerp zijn geschreven. Houd er rekening mee dat dit een belangrijke factor is, vooral als u in een vergaderruimte zit of bij iemand thuis een deal van $ 400.000 bespreekt.
Het ontwikkelen van een goede verstandhouding is een vaardigheid die kan worden geleerd en verbeterd.
o We hebben allemaal wel eens een verkoper meegemaakt die ons iets verkocht en toch hadden we niet het gevoel dat we verkocht werden. De reden is dat hij of zij ervoor zorgde dat u zich op uw gemak voelde op de plek waar u ze vertrouwde.
Hoe ontwikkelen we een verstandhouding?
o Gebruik je ogen en oren en stel vragen. Uitleggen
o Gebruik de ogen:
o Kijk naar hun kleding, hun auto, hun persoonlijke bezittingen en ik bedoel, kijk echt naar ze en ontcijfer wat dat je over hen vertelt.
o Gebruik de oren:
o Luister naar wat ze zeggen en stel vragen om hun echte MOTIVATIE te doorgronden!
Tijdens dit hele gesprek zul je waarschijnlijk een of twee dingen ontdekken die je met hen gemeen hebt. (Familie, geografische gebieden, vissen, enz.) Als u gemeenschappelijke punten tegenkomt, laat hen dan weten dat u bekend bent en neem dan even de tijd om dit met hen te bespreken.
Wat is het doel?
o Zodra ze je als een van hen accepteren, ben je in een positie om echt een geweldige ervaring in de verkoop te hebben, omdat je nu samenwerkt en als een team – je bent niet langer de verkoper, je zit nu in een adviserende positie .
o Bedenk dat de klant je wel of niet in zijn wereld wil laten komen. Als je dit begrijpt en echt je best doet om empathisch voor hem/haar te worden, kun je een vertrouwenspositie verwerven. In de meeste gevallen zul je ze daadwerkelijk zien ontspannen (lichaamstaal) als dit onderweg gebeurt.
o Om dit te illustreren, heb je ooit een toespraak gehouden en gemerkt dat als je eindelijk contact maakte met een publiekslid, hij of zij goedkeurend knikte. Deze dingen lijken misschien allemaal banaal, maar dat zijn ze niet.
Tot slot: als je het vertrouwen van een klant kunt winnen, is het verkopen van een product of dienst veel gemakkelijker en kan de ervaring voor alle betrokkenen plezierig zijn.
Onthoud altijd dat een Win/Win de beste situatie is.
Lijnen. String-invoer/-uitvoer. Geformatteerde I/O. Stringverwerking met behulp van standaard C-taalfuncties. Werken met geheugen.
1.1. Declaratie en initialisatie van strings.
Een string is een array van tekens die eindigt met het lege teken '\0'. De string wordt gedeclareerd als een reguliere karakterarray, bijvoorbeeld
teken s1; // tekenreeks van negen tekens lang
teken *s2; // verwijzing naar tekenreeks
Het verschil tussen pointers s1 en s2 is dat pointer s1 een benoemde constante is, en pointer s2 een variabele.
Tekenreeksconstanten worden tussen dubbele aanhalingstekens geplaatst, in tegenstelling tot tekens die tussen enkele aanhalingstekens staan. Bijvoorbeeld,
“Dit is een touwtje.”
De lengte van een stringconstante mag volgens de standaard niet langer zijn dan 509 tekens. Veel implementaties maken echter langere tekenreekslengtes mogelijk.
Bij het initialiseren van strings is het beter om de arraygrootte niet op te geven; de compiler doet dit door de lengte van de string te berekenen en er één aan toe te voegen. Bijvoorbeeld,
char s1 = “Dit is een tekenreeks.”;
In de programmeertaal C zijn er een groot aantal functies voor het werken met strings, waarvan de prototypes worden beschreven in de headerbestanden stdlib.h en string.h. Het werken met deze functies wordt in de volgende paragrafen besproken.
1.2. String-invoer/-uitvoer.
Gebruik de functie om een tekenreeks vanuit de console in te voeren
char* krijgt(char *str);
die een string naar het adres str schrijft en het adres van de ingevoerde string retourneert. De functie stopt de invoer als deze een ‘\n’- of EOF-teken (einde van bestand) tegenkomt. Het nieuweregelteken wordt niet gekopieerd. Aan het einde van de leesregel wordt een nulbyte geplaatst. Als dit lukt, retourneert de functie een verwijzing naar de gelezen regel, en als dit niet lukt, NULL.
Gebruik de standaardfunctie om een string naar de console uit te voeren
int zet (const char *s);
die, indien succesvol, een niet-negatief getal retourneert, en indien niet succesvol, EOF retourneert.
De prototypes van de functie Gets en Puts worden beschreven in het headerbestand stdio.h.
#erbij betrekken
printf("Invoerreeks: ");
1.3. Geformatteerde I/O.
Gebruik de functie voor geformatteerde gegevensinvoer vanaf de console
int scanf (const char *format, ...);
die, indien succesvol, het aantal gelezen gegevenseenheden retourneert, en indien niet succesvol, EOF retourneert. De formatparameter moet verwijzen naar de te formatteren string, die de specificaties voor het invoerformaat bevat. Het aantal en de typen argumenten die op de opmaaktekenreeks volgen, moeten overeenkomen met het aantal en de typen invoerindelingen die in de opmaaktekenreeks zijn opgegeven. Als niet aan deze voorwaarde wordt voldaan, is het resultaat van de functie onvoorspelbaar.
Een spatie, "\t" of "\n" teken in een opmaaktekenreeks beschrijft een of meer lege tekens in de invoerstroom, waaronder de tekens: spatie, '\t', '\n', '\v', '\F '. De scanf-functie slaat lege tekens in de invoerstroom over.
Letterlijke tekens in een formatstring, met uitzondering van het %-teken, vereisen dat exact dezelfde tekens in de invoerstroom verschijnen. Als een dergelijk teken niet bestaat, stopt de scanf-functie met invoeren. De scanf-functie slaat letterlijke tekens over.
Over het algemeen ziet de specificatie van het invoerformaat er als volgt uit:
%[*] [breedte] [modifiers] type
Het symbool '*' duidt op een weglating bij het invoeren van een veld dat door deze specificatie wordt gedefinieerd;
- ‘breedte’ definieert het maximale aantal tekens dat volgens deze specificatie kan worden ingevoerd;
Het type kan de volgende waarden aannemen:
c – karakterarray,
s – een reeks tekens, regels worden gescheiden door lege tekens,
d – geheel getal met teken van 10 s/s,
i – geheel getal met teken, het getalsysteem is afhankelijk van de eerste twee cijfers,
u – geheel getal zonder teken bij 10 s/s,
o – geheel getal zonder teken in 8 s/s,
x, X – geheel getal zonder teken bij 16 s/s,
e, E, f, g, G – zwevend getal,
p – aanwijzer naar aanwijzer,
n – verwijzing naar een geheel getal,
[…] – een reeks gescande tekens, bijvoorbeeld .
In het laatste geval worden alleen de tekens tussen vierkante haken ingevoerd uit de invoerstroom. Als het eerste teken tussen de vierkante haakjes '^' is, worden alleen de tekens ingevoerd die niet in de array staan. Het tekenbereik in de array wordt gespecificeerd met behulp van het symbool '-'. Wanneer u tekens invoert, worden ook de eerste blanco tekens en de laatste null-byte van de tekenreeks ingevoerd.
Modifiers kunnen de volgende waarden aannemen:
h – kort geheel getal,
l, L – lang geheel getal of zwevend,
en worden alleen gebruikt voor gehele getallen of zwevende getallen.
In het volgende voorbeeld ziet u het gebruik van de scanf-functie. Houd er rekening mee dat de formaatspecificatie, beginnend met de invoer van zwevende getallen, wordt voorafgegaan door een spatie.
#erbij betrekken
printf("Voer een geheel getal in: ");
scanf("%d", &n);
printf("Voer een dubbele in: ");
scanf(" %lf", &d);
printf("Voer een teken in: ");
scanf(" %c", &c);
printf("Voer een tekenreeks in: ");
scanf(" %s", &s);
Merk op dat in dit programma het drijvende-kommagetal wordt geïnitialiseerd. Dit wordt gedaan zodat de compiler een bibliotheek bevat ter ondersteuning van het werken met zwevende getallen. Als dit niet wordt gedaan, zal er tijdens runtime een fout optreden bij het invoeren van een zwevend getal.
Gebruik de functie voor geformatteerde uitvoer van gegevens naar de console
int printf (const char *formaat, ...);
die, indien succesvol, het aantal gegevensuitvoereenheden retourneert, en indien niet succesvol, EOF retourneert. De formaatparameter is een formaattekenreeks die specificaties voor uitvoerformaten bevat. Het aantal en de typen argumenten die volgen op de indelingsreeks moeten overeenkomen met het aantal en de typen uitvoerindelingsspecificaties die zijn opgegeven in de indelingsreeks. Over het algemeen ziet de specificatie van het uitvoerformaat er als volgt uit:
%[flags] [breedte] [.precision] [modifiers] type
- ‘vlaggen’ zijn verschillende symbolen die het uitvoerformaat specificeren;
- ‘breedte’ definieert het minimumaantal tekens dat wordt uitgevoerd volgens deze specificatie;
- ‘.precision’ definieert het maximale aantal weergegeven tekens;
- ‘modifiers’ specificeren het type argumenten;
- 'type' specificeert het type argument.
Om ondertekende gehele getallen uit te voeren, wordt het volgende uitvoerformaat gebruikt:
%[-] [+ | ruimte] [breedte] [l] d
- – uitlijning links, standaard – rechts;
+ – het ‘+’ teken wordt weergegeven. Houd er rekening mee dat voor negatieve getallen altijd het ‘-’ teken wordt weergegeven;
‘spatie’ – er wordt een spatie weergegeven op de tekenpositie;
d – int-gegevenstype.
Om niet-ondertekende gehele getallen uit te voeren, gebruikt u het volgende uitvoerformaat:
%[-] [#] [breedte] [l]
# – initiële 0 wordt uitgevoerd voor getallen in 8 c/c of initiële 0x of 0X voor getallen in 16 c/c,
l – lange datatype-modifier;
u – geheel getal in 10c/c,
o – geheel getal in 8 c/c,
x, X – geheel getal bij 16 c/c.
Om getallen met drijvende komma uit te voeren, wordt het volgende uitvoerformaat gebruikt:
%[-] [+ | spatie] [breedte] [.precisie]
"precisie" - geeft het aantal cijfers achter de komma aan voor de formaten f, e en E of het aantal significante cijfers voor de formaten g en G. Getallen worden afgerond. De standaardprecisie is zes decimalen;
f – vast puntnummer,
e – een getal in exponentiële vorm, de exponent wordt aangegeven met de letter “e”,
E – een getal in exponentiële vorm, de exponent wordt aangegeven met de letter “E”,
g – de kortste van de f- of g-formaten,
G – de kortste van de f- of G-formaten.
printf ("n = %d\n f = %f\n e = %e\n E = %E\n f = %.2f", -123, 12.34, 12.34, 12.34, 12.34);
// afdrukken: n = 123 f = 12,340000 e = 1,234000e+001 E = 1,234000E+001 f = 12,34
1.4. Tekenreeksen opmaken.
Er zijn varianten van de functies scanf en printf die zijn ontworpen om tekenreeksen op te maken en die respectievelijk sscanf en sprintf worden genoemd.
int sscanf (const char *str, const char *format, ...);
leest gegevens uit de string gespecificeerd door str, volgens de formatstring gespecificeerd door format. Als dit lukt, wordt het aantal gelezen gegevens geretourneerd en als dit niet lukt, wordt EOF geretourneerd. Bijvoorbeeld,
#erbij betrekken
char str = "a 10 1.2 String Geen invoer";
sscanf(str, "%c %d %lf %s", &c, &n, &d, s);
printf("%c\n", c); // afdrukken: een
printf("%d\n", n); // afdrukken: 10
printf("%f\n", d); // afdrukken: 1.200000
printf("%s\n", s); //afdrukken: String
int sprintf (char *buffer, const char *format, ...);
formatteert de tekenreeks in overeenstemming met het formaat dat is opgegeven door de formatparameter en schrijft het resulterende resultaat naar de bufferkarakterarray. De functie retourneert het aantal tekens dat naar de tekenarraybuffer is geschreven, exclusief de afsluitende nulbyte. Bijvoorbeeld,
#erbij betrekken
char str = "c = %c, n = %d, d = %f, s = %s";
char s = "Dit is een tekenreeks.";
sprintf(buffer, str, c, n, d, s);
printf("%s\n", buffer); // prints: c = c, n = 10, d = 1,200000, s = Dit is een string
1.5. Converteer tekenreeksen naar numerieke gegevens.
Prototypes van functies voor het converteren van strings naar numerieke gegevens worden gegeven in het headerbestand stdlib.h, dat in het programma moet worden opgenomen.
Gebruik de functie om een string naar een geheel getal te converteren
int atoi (const char *str);
char *str = “-123”;
n = atoi(str); // n = -123
Gebruik de functie om een string naar een lang geheel getal te converteren
lange int atol (const char *str);
die, indien succesvol, het gehele getal retourneert waarnaar de tekenreeks str wordt geconverteerd, en indien niet succesvol, 0 retourneert. Bijvoorbeeld:
char *str = “-123”;
n = atol(str); // n = -123
Gebruik de functie om een string naar een dubbel getal te converteren
dubbele atof(const char *str);
die, in geval van succes, een zwevend getal van het type double retourneert, waarin de string str wordt omgezet, en in geval van mislukking 0. Bijvoorbeeld:
char *str = “-123.321”;
n = atof(str); // n = -123,321
De volgende functies voeren soortgelijke functies uit als atoi, atol, atof, maar bieden meer geavanceerde functionaliteit.
lange int strtol (const char *str, char **endptr, int base);
converteert de string str naar een lang int-getal, dat wordt geretourneerd. De parameters van deze functie hebben de volgende doeleinden.
Als grondtal 0 is, hangt de conversie af van de eerste twee tekens van str:
Als het eerste teken een getal van 1 tot en met 9 is, wordt aangenomen dat het getal wordt weergegeven in 10 c/c;
Als het eerste teken het cijfer 0 is en het tweede teken een cijfer van 1 tot en met 7, wordt aangenomen dat het getal wordt weergegeven in 8 c/c;
Als het eerste teken 0 is en het tweede 'X' of 'x', wordt aangenomen dat het getal wordt weergegeven in 16 c/c.
Als grondtal een getal tussen 2 en 36 is, wordt die waarde genomen als het grondtal van het getalsysteem en stopt elk teken buiten het getalsysteem met converteren. In getalsystemen met grondtal 11 tot en met grondtal 36 worden de symbolen 'A' tot 'Z' of 'a' tot 'z' gebruikt om cijfers weer te geven.
De waarde van het endptr-argument wordt ingesteld door de strtol-functie. Deze waarde bevat een verwijzing naar het teken dat ervoor zorgde dat de tekenreeks str niet werd geconverteerd. Als dit lukt, retourneert de functie strtol het geconverteerde getal, en als dit niet lukt, retourneert deze 0. Bijvoorbeeld:
n = strtol (“12a”, &p, 0);
printf("n = %ld, %stop = %c, n, *p); // n = 12, stop = een
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
niet-ondertekende lange int strtol (const char *str, char **endptr, int base);
werkt op dezelfde manier als de strtol-functie, maar converteert de symbolische weergave van een getal naar een getal van het type unsigned long int.
dubbele strtod (const char *str, char **endptr);
Converteert de symbolische weergave van een getal naar een dubbel.
Alle in deze paragraaf genoemde functies stoppen met werken wanneer ze het eerste teken tegenkomen dat niet past in het formaat van het betreffende getal.
Als de tekenwaarde van een getal bovendien het bereik van acceptabele waarden voor het overeenkomstige gegevenstype overschrijdt, stellen de functies atof, strtol, strtoul, strtod de waarde van de errno-variabele in op ERANGE. De errno-variabele en de ERANGE-constante worden gedefinieerd in het math.h-headerbestand. In dit geval retourneren de functies atof en strtod de waarde HUGE_VAL, retourneert de functie strtol de waarde LONG_MAX of LONG_MIN, en retourneert de functie strtoul de waarde ULONG_MAX.
De niet-standaard functies itoa, ltoa, utoa, ecvt, fcvt en gcvt kunnen worden gebruikt om numerieke gegevens naar tekenreeksen te converteren. Maar het is beter om voor deze doeleinden de standaard sprintf-functie te gebruiken.
1.6. Standaardfuncties voor het werken met strings.
In deze sectie worden functies besproken voor het werken met strings, waarvan de prototypes worden beschreven in het headerbestand string.h.
1. Stringvergelijking. De functies strcmp en strncmp worden gebruikt om strings te vergelijken.
int strcmp (const char *str1, const char *str2);
vergelijkt lexicografisch de strings str1, str2 en retourneert –1, 0 of 1 als str1 respectievelijk kleiner is dan, gelijk is aan of groter is dan str2.
int strncmp (const char *str1, const char *str2, size_t n);
vergelijkt lexicografisch maximaal de eerste n tekens uit de strings str1 en str2. De functie retourneert -1, 0 of 1 als de eerste n tekens uit str1 respectievelijk kleiner, gelijk aan of groter zijn dan de eerste n tekens uit str2.
// voorbeeld van stringvergelijking
#erbij betrekken
#erbij betrekken
char str1 = "aa bb";
char str2 = "aa aa";
char str3 = "aa bb cc";
printf("%d\n", strcmp(str1, str3)); // afdrukken: -1
printf("%d\n", strcmp(str1, str1)); //afdrukken: -0
printf("%d\n", strcmp(str1, str2)); // afdrukken: 1
printf("%d\n", strncmp(str1, str3, 5)); //afdrukken: 0
2. Lijnen kopiëren. De strcpy- en strncpy-functies worden gebruikt om tekenreeksen te kopiëren.
char *strcpy (char *str1, const char *str2);
kopieert de tekenreeks str2 naar de tekenreeks str1. De volledige string str2 wordt gekopieerd, inclusief de afsluitende nulbyte. De functie retourneert een pointer naar str1. Als de lijnen elkaar overlappen, is het resultaat onvoorspelbaar.
char *strncpy (char *str1, const char *str2, size_t n);
kopieert n tekens van string str2 naar string str1. Als str2 minder dan n tekens bevat, wordt de laatste nulbyte zo vaak als nodig gekopieerd om str2 uit te breiden naar n tekens. De functie retourneert een verwijzing naar de tekenreeks str1.
char str2 = "Kopieer tekenreeks.";
strcpy(str1, str2);
printf(str1); // prints: tekenreeks kopiëren.
4. Snaren verbinden. De functies strcat en strncat worden gebruikt om strings samen te voegen tot één string.
char* strcat (char *str1, const char *str2);
voegt string str2 toe aan string str1, waarbij de laatste nulbyte van string str1 wordt gewist. De functie retourneert een verwijzing naar de tekenreeks str1.
char* strncat (char *str1, const char *str2, size_t n);
voegt n tekens toe van string str2 aan string str1, waarbij de laatste nulbyte van string str1 wordt gewist. De functie retourneert een verwijzing naar de tekenreeks str1. als de lengte van de string str2 kleiner is dan n, worden alleen de tekens uit de string str2 toegevoegd. Na het aaneenschakelen van strings wordt altijd een null-byte toegevoegd aan str1. De functie retourneert een verwijzing naar de tekenreeks str1.
#erbij betrekken
#erbij betrekken
char str1 = "String";
char str2 = "catenatie";
char str3 = "Ja Nee";
strcat(str1, str2);
printf("%s\n", str1); // prints: String-catenatie
strncat(str1, str3, 3);
printf("%s\n", str1); // prints: String-catenatie Ja
5. Zoek naar een teken in een string. Om een teken in een string te zoeken, gebruik je de functies strchr, strrchr, strspn, strcspn en strpbrk.
char* strchr (const char *str, int c);
zoekt naar de eerste keer dat het teken voorkomt dat is opgegeven door c in de tekenreeks str. Als dit lukt, retourneert de functie een verwijzing naar het eerste gevonden teken, en als dit niet lukt, NULL.
char* strrchr (const char *str, int c);
zoekt naar de laatste keer dat het teken voorkomt dat is opgegeven door c in de tekenreeks str. Als dit lukt, retourneert de functie een verwijzing naar het laatst gevonden teken, en als dit niet lukt, NULL.
#erbij betrekken
#erbij betrekken
char str = "Char zoeken";
printf("%s\n", strchr(str, "r")); //afdrukken: r zoeken
printf("%s\n", strrchr(str, "r")); // afdrukken: rch
size_t strspn (const char *str1, const char *str2);
retourneert de index van het eerste teken uit str1 dat niet in str2 staat.
size_t strcspn (const char *str1, const char *str2);
retourneert de index van het eerste teken uit str1 dat in str2 verschijnt.
char str = "123 abc";
printf ("n =%d\n", strspn (str, "321"); // prints: n = 3
printf ("n =%d\n", strcspn (str, "cba"); // prints: n = 4
char* strpbrk (const char *str1, const char *str2);
vindt het eerste teken in de string str1 dat gelijk is aan een van de tekens in de string str2. Als dit lukt, retourneert de functie een verwijzing naar dit teken, en als dit niet lukt, NULL.
char str = "123 abc";
printf("%s\n", strpbrk(str, "bca")); // afdrukken: abc
6. Stringvergelijking. De strstr-functie wordt gebruikt om strings te vergelijken.
char* strstr (const char *str1, const char *str2);
vindt de eerste keer dat str2 voorkomt (zonder de afsluitende nulbyte) in str1. Als dit lukt, retourneert de functie een verwijzing naar de gevonden subtekenreeks, en als dit niet lukt, NULL. Als de str1-aanwijzer naar een tekenreeks met lengte nul verwijst, retourneert de functie de str1-aanwijzer.
char str = "123 abc 456;
printf ("%s\n", strstr (str, "abc"); // print: abc 456
7. Een string in tokens parseren. De strtok-functie wordt gebruikt om een string in tokens te parseren.
char* strtok (char *str1, const char *str2);
retourneert een verwijzing naar het volgende token (woord) in de tekenreeks str1, waarbij de tokenscheidingstekens tekens uit de tekenreeks str2 zijn. Als er geen tokens meer zijn, retourneert de functie NULL. Bij de eerste aanroep van de functie strtok moet de parameter str1 verwijzen naar een tekenreeks die is getokeniseerd, en bij volgende aanroepen moet deze parameter worden ingesteld op NULL. Nadat een token is gevonden, schrijft de strtok-functie een null-byte na dit token in plaats van het scheidingsteken.
#erbij betrekken
#erbij betrekken
char str = "12 34 abcd";
p = strtok(str, " ");
printf("%s\n", p); // drukt de waarden af in een kolom: 12 34 ab cd
p = strtok(NULL, " ");
8. Bepalen van de lengte van een snaar. De strlen-functie wordt gebruikt om de lengte van een string te bepalen.
size_t strlen (const char *str);
retourneert de lengte van de tekenreeks, exclusief de laatste nulbyte. Bijvoorbeeld,
char str = "123";
printf("len = %d\n", strlen(str)); //afdrukken: len = 3
1.7. Functies voor het werken met geheugen.
Het headerbestand string.h beschrijft ook functies voor het werken met geheugenblokken, die vergelijkbaar zijn met de overeenkomstige functies voor het werken met strings.
void* memchr (const void *str, int c, size_t n);
zoekt naar het eerste exemplaar van het teken gespecificeerd door c in n bytes van de string str.
int memcmp (const void *str1, const void *str2, size_t n);
vergelijkt de eerste n bytes van de strings str1 en str2.
void* memcpy (const void *str1, const void *str2, size_t n);
kopieert de eerste n bytes van string str1 naar string str2.
void* memmove (const void *str1, const void *str2, size_t n);
kopieert de eerste n bytes van str1 naar str2, zodat overlappende tekenreeksen correct worden afgehandeld.
void* memset (const void *str, int c, size_t n);
kopieert het teken gespecificeerd door c naar de eerste n bytes van str.
De moderne C++-standaard definieert een klasse met functies en eigenschappen (variabelen) voor het organiseren van werk met strings (in de klassieke C-taal zijn er geen strings als zodanig, er zijn alleen arrays van char-tekens):
#erbij betrekken
#erbij betrekken#erbij betrekken
Om met strings te werken, moet je ook een standaard naamruimte koppelen:
Namespace std; gebruiken;
Anders moet u overal de klassedescriptor std::string opgeven in plaats van string .
Hieronder staat een voorbeeld van een programma dat met string werkt (werkt niet in oudere C-compatibele compilers!):
#erbij betrekken
De belangrijkste kenmerken van de stringklasse:
- initialisatie met een reeks tekens (een ingebouwd stringtype) of een ander object van het type string . Een ingebouwd type heeft de tweede mogelijkheid niet;
- het kopiëren van de ene regel naar de andere. Voor een ingebouwd type moet je de strcpy() functie gebruiken;
- toegang tot individuele karakters van een string voor lezen en schrijven. In een ingebouwde array gebeurt dit met behulp van een indexbewerking of indirecte adressering met behulp van een pointer;
- twee strings vergelijken op gelijkheid. Voor een ingebouwd type worden de functies van de strcmp()-familie gebruikt;
- aaneenschakeling (aaneenschakeling) van twee strings, waardoor het resultaat ontstaat als een derde string of in plaats van een van de originele. Voor een ingebouwd type wordt de functie strcat() gebruikt, maar om het resultaat op een nieuwe regel te krijgen, moet je de functies strcpy() en strcat() opeenvolgend gebruiken, en ook zorgen voor de geheugentoewijzing;
- ingebouwde manier om de lengte van een string te bepalen (klasselidfuncties size() en lengte()). De enige manier om de lengte van een ingebouwde typestring te achterhalen is door deze te berekenen met de functie strlen();
- mogelijkheid om erachter te komen of een string leeg is.
Laten we deze basisfuncties in meer detail bekijken.
Strings initialiseren bij het beschrijven en Snaarlengte(exclusief de afsluitende null-terminator):
String st("Mijn string\n"); uit<< "Длина " << st << ": " << st.size() << " символов, включая символ новой строки\n";
De string kan ook leeg zijn:
String st2;
Om dat te controleren is de regel leeg, je kunt de lengte ervan vergelijken met 0:
Als (! st.size()) // leeg
of gebruik de empty() methode, die true retourneert voor een lege string en false voor een niet-lege string:
Als (st.empty()) // leeg
De derde vorm van het maken van tekenreeksen initialiseert een object van het type string met een ander object van hetzelfde type:
Tekenreeks st3(st);
De string st3 wordt geïnitialiseerd met de string st. Hoe kunnen we ervoor zorgen dat deze de lijnen komen overeen? Laten we de vergelijkingsoperator (==) gebruiken:
If (st == st3) // initialisatie werkte
Hoe kopieer de ene regel naar de andere? Met behulp van de normale toewijzingsoperator:
St2 = st3; // kopieer st3 naar st2
Voor aaneenschakeling van tekenreeksen de optellingsoperator (+) of de optelling plus toewijzingsoperator (+=) wordt gebruikt. Laten we twee regels geven:
Tekenreeks s1("hallo, "); string s2("wereld\n");
We kunnen op deze manier een derde string krijgen die bestaat uit een aaneenschakeling van de eerste twee:
Tekenreeks s3 = s1 + s2;
Als we s2 aan het einde van s1 willen toevoegen, moeten we schrijven:
S1 += s2;
De optelbewerking kan klasseobjecten aaneenschakelen snaar niet alleen onderling, maar ook met ingebouwde typestrings. U kunt het bovenstaande voorbeeld herschrijven, zodat speciale tekens en leestekens worden weergegeven door het ingebouwde type char *, en significante woorden worden weergegeven door objecten van de klassereeks:
Const char *pc = ", "; tekenreeks s1("hallo"); tekenreeks s2("wereld"); tekenreeks s3 = s1 + pc + s2 + "\n"; uit<< endl << s3;
Dergelijke expressies werken omdat de compiler "weet" hoe hij automatisch objecten van het ingebouwde type moet converteren naar objecten van de stringklasse. Het is ook mogelijk om eenvoudig een ingebouwde string aan een stringobject toe te wijzen:
Tekenreeks s1; const char *pc = "een tekenarray"; s1 = pc; // Rechts
In dit geval de omgekeerde transformatie werkt niet. Als u probeert de volgende ingebouwde tekenreeks-initialisatie uit te voeren, zal dit een compilatiefout veroorzaken:
Char *str = s1; // compilatiefout
Om deze conversie uit te voeren, moet u expliciet een lidfunctie aanroepen met de naam c_str() ("C string"):
Const char *str = s1.c_str();
De functie c_str() retourneert een pointer naar een karakterarray die de string van het stringobject bevat, zoals deze zou verschijnen in het ingebouwde stringtype. Het trefwoord const voorkomt hier de "gevaarlijke" mogelijkheid in moderne visuele omgevingen om de inhoud van een object rechtstreeks via een aanwijzer te wijzigen.
NAAR individuele karakters een object van het type string , zoals een ingebouwd type, is toegankelijk via de indexbewerking. Hier is bijvoorbeeld een stukje code dat alle punten vervangt door onderstrepingstekens:
String str("www.disney.com"); int grootte = str.grootte(); voor (int i = 0; ik< size; i++) if (str[i] == ".") str[ i ] = "_"; cout << str;
Vervang(str.begin(), str.end(), ".", "_");
Het is waar dat hier niet de vervangingsmethode van de stringklasse wordt gebruikt, maar het gelijknamige algoritme:
#erbij betrekken
Omdat het stringobject zich als een container gedraagt, kunnen er andere algoritmen op worden toegepast. Hiermee kunt u problemen oplossen die niet direct worden opgelost door de functies van de stringklasse.
Hieronder vindt u een korte beschrijving van de belangrijkste operators en functies van de stringklasse. Links in de tabel leiden naar Russischtalige beschrijvingen op internet. Een completere lijst van de mogelijkheden van de stringklasse is bijvoorbeeld te vinden op Wikipedia of op de website cplusplus.com.
Tekens in een string opgeven |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exploitant= |
wijst waarden toe aan een string |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
toewijzen |
wijst tekens toe aan een string |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Toegang tot individuele karakters |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bij |
het opgegeven teken ophalen en controleren of de index buiten bereik is |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exploitant |
het opgegeven teken verkrijgen |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
voorkant |
het eerste teken krijgen |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
rug |
het laatste teken krijgen |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gegevens |
retourneert een pointer naar het eerste teken van de string |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
c_str |
geeft terug onveranderbaar een C-karakterarray die de karakters van de string bevat |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Lijncapaciteitscontrole |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
leeg |
controleert of een string leeg is |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
maat |
retourneert het aantal tekens in een tekenreeks |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
max_grootte |
retourneert het maximale aantal tekens |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
reserveren |
reserveert opslagruimte |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
String-bewerkingen |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
duidelijk |
wist de inhoud van een string |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
invoegen |
tekens invoegen |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
wissen |
tekens verwijderen |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
terugduwen |
het toevoegen van een teken aan het einde van een string |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pop_back |
verwijdert het laatste teken |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
toevoegen |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exploitant+= |
voegt tekens toe aan het einde van een tekenreeks |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vergelijken |
vergelijkt twee strings |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vervangen |
vervangt elk voorkomen van het opgegeven teken |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
onderstr |
retourneert een subtekenreeks |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
kopiëren |
kopieert karakters |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
formaat wijzigen |
verandert het aantal opgeslagen tekens |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tekenreeksen declarerenEen string in de C-taal is een eendimensionale reeks tekens, waarvan het laatste element het teken aan het einde van de regel is: nul (een string die wordt beëindigd door nul, dat wil zeggen een NULL-beëindigde string). Het declareren van een variabele van het type string in de C-taal is op drie manieren mogelijk, waarvan er twee de string initialiseren op het moment van declaratie. Eerste manier:Karakterarray-declaraties (vergeet niet om ruimte toe te voegen voor de afsluitende nul): Char's; Tweede manier:Wijs de initiële waarde toe aan de stringvariabele (in dit geval kan de compiler de lengte van de string zelf berekenen): Char s = "Voorbeeld van stringinitialisatie"; Rechts van het toewijzingsteken staat een stringconstante. Er wordt automatisch een nul (‘\0’) toegevoegd aan het einde van de regel. Tekenreeksconstanten worden in een statische geheugenklasse geplaatst. Derde manier:Impliciete indicatie dat een array wordt gebruikt. Links van het toewijzingsteken staat een verwijzing naar het symbool: Char *s="Tweede initialisatieoptie"; De variabele s zal een verwijzing zijn naar de locatie in het RAM waar de stringconstante zich bevindt. Een mogelijke valkuil bij deze vorm van notatie is dat een verwijzing naar een teken vaak een string wordt genoemd. Het onderstaande item is slechts een verwijzing naar een teken, aangezien er geen ruimte is voor de string: Char *s; Een tekenreeks invoeren vanaf een standaardinvoerapparaat (toetsenbord)Er is een reeks functies voor het werken met tekenreeksen. Voor invoer vanaf een standaard invoerapparaat (toetsenbord) worden meestal bibliotheekfuncties van de standaard invoer-/uitvoermodule gebruikt: scannenf En krijgt. Om een string in te voeren met behulp van de functie scannenf, gebruikt het formaat « %S» en merk op dat het adresteken niet vóór de lijnidentificatie wordt gebruikt « & » , aangezien een eendimensionale array al wordt weergegeven door een verwijzing naar het begin: Scanf("%s", s); Functie krijgt() leest tekens totdat het een nieuwregelteken bereikt. De functie accepteert alle tekens tot aan het nieuweregelteken, maar neemt dit niet op. Aan het einde van de regel wordt een afsluitende nul ('\0') toegevoegd. Functie krijgt() plaatst de reeks tekens die vanaf het toetsenbord worden gelezen in een parameter van het type string en retourneert een verwijzing naar deze string (als de bewerking succesvol was), of NULL (in geval van een fout). Als de bewerking in het onderstaande voorbeeld succesvol is voltooid, worden twee identieke regels op het scherm weergegeven: #erbij betrekken Merk terloops op dat de get-functie vaak wordt gebruikt om gegevens van het toetsenbord als een string in te voeren met het oog op verdere conversie door de sscanf-functie naar het gewenste formaat of voor voorlopige analyse van de invoergegevens, bijvoorbeeld: #erbij betrekken Tekenreeksen afdrukken naar standaarduitvoer (monitorscherm)Om strings naar het standaard uitvoerapparaat (monitorscherm) uit te voeren, kunt u twee functies gebruiken afdrukkenf En zet. De printf-functie wordt als formaat "%s" doorgegeven. Het gemak van het gebruik van deze functie is dat u naast een string direct gegevens van andere typen kunt weergeven. Kenmerk Kenmerk zet is dat nadat een regel is afgedrukt, deze automatisch naar de volgende regel gaat. Functies voor het werken met stringsOm strings in de C-taal te converteren, is de stringbibliotheek beschikbaar. Elke functie heeft zijn eigen opnameformaat (prototype). De meest gebruikte functies worden in dit artikel besproken. - lezen Voorbeeld van programma's (lijst) die met strings werken 34--- C#-handleiding --- Tekenreeksen Vanuit een normaal programmeeroogpunt is string tekenreeks gegevenstype is een van de belangrijkste in C#. Dit type definieert en ondersteunt tekenreeksen. In een aantal andere programmeertalen is een string een array van tekens. En in C# zijn strings objecten. Daarom is het tekenreekstype een referentietype. Snaren bouwenDe eenvoudigste manier om een tekenreeks te construeren is door een letterlijke tekenreeks te gebruiken. De volgende coderegel wijst bijvoorbeeld de tekenreeksreferentievariabele str een verwijzing toe naar een letterlijke tekenreeks: String str = "Voorbeeldreeks"; In dit geval wordt de variabele str geïnitialiseerd met de reeks tekens "Example String". Een object van het type string kan ook worden gemaakt op basis van een array van het type char. Bijvoorbeeld: Char chararray = ("e", "x", "a", "m", "p", "l", "e"); string str = nieuwe string(chararray); Zodra een stringobject is gemaakt, kan het overal worden gebruikt waar u een tekstreeks tussen aanhalingstekens nodig heeft. String persistentieVreemd genoeg kan de inhoud van een object van het type string niet worden gewijzigd. Dit betekent dat zodra een tekenreeks is gemaakt, deze niet meer kan worden gewijzigd. Maar deze beperking draagt bij aan een efficiëntere implementatie van tekenreeksen. Daarom verandert dit ogenschijnlijk voor de hand liggende nadeel feitelijk in een voordeel. Als er dus een string nodig is als variatie op een bestaande string, dan moet voor dit doel een nieuwe string worden aangemaakt die alle noodzakelijke wijzigingen bevat. En aangezien ongebruikte stringobjecten automatisch als afval worden verzameld, hoeft u zich niet eens zorgen te maken over het lot van onnodige strings. Er moet echter worden benadrukt dat variabele verwijzingen naar strings (dat wil zeggen objecten van het type string) aan verandering onderhevig zijn, en daarom naar een ander object kunnen verwijzen. Maar de inhoud van het stringobject zelf verandert niet nadat het is gemaakt. Laten we eens kijken naar een voorbeeld: Static void addNewString() ( string s = "Dit is mijn streek"; s = "Dit is een nieuwe streek"; ) Laten we de applicatie compileren en de resulterende assembly in het hulpprogramma ildasm.exe laden. De afbeelding toont de CIL-code die wordt gegenereerd voor de void addNewString() -methode: Merk op dat er talloze aanroepen zijn naar de ldstr-opcode (string load). Deze CIL ldstr-opcode laadt een nieuw stringobject op de beheerde heap. Als gevolg hiervan wordt het vorige object dat de waarde 'Dit is mijn slag' bevatte uiteindelijk verzameld als afval. Werken met tekenreeksenIn de klas Systeem.String er is een reeks methoden beschikbaar voor het bepalen van de lengte van tekengegevens, het zoeken naar een subtekenreeks in de huidige tekenreeks, het converteren van tekens van hoofdletters naar kleine letters en omgekeerd, enz. Vervolgens zullen we deze klasse in meer detail bekijken. Veld-, Indexer- en String-klasse-eigenschapDe klasse String definieert één enkel veld: Openbare statische alleen-lezen tekenreeks Leeg; Het lege veld geeft een lege string aan, d.w.z. een string die geen karakters bevat. Dit verschilt van een lege String-verwijzing, die eenvoudigweg naar een niet-bestaand object wordt gemaakt. Bovendien definieert de klasse String een enkele alleen-lezen indexer: Openbare char dit (krijg;) Met deze indexer kunt u een teken bij een opgegeven index ophalen. Het indexeren van strings, zoals arrays, begint vanaf nul. String-objecten zijn persistent en veranderen niet. Het is dus logisch dat de klasse String een alleen-lezen indexeerfunctie ondersteunt. Ten slotte definieert de klasse String een enkele alleen-lezen eigenschap: Publieke int Lengte (krijg; ) De eigenschap Length retourneert het aantal tekens in de tekenreeks. Het onderstaande voorbeeld toont het gebruik van de indexer en de eigenschap Length: Systeem gebruiken; class Voorbeeld ( static void Main() ( string str = "Eenvoudige string"; // Haal de lengte van de string en het 6e teken in de regel op met behulp van de indexer Console.WriteLine("Lengte van de string is (0), 6e teken is "(1)"" , str.Length, str); Operators van stringklassenDe klasse String overbelast de volgende twee operators: == en !=. De operator == wordt gebruikt om twee tekenreeksen op gelijkheid te testen. Wanneer de operator == wordt toegepast op objectverwijzingen, wordt doorgaans getest of beide verwijzingen naar hetzelfde object worden gemaakt. En wanneer de operator == wordt toegepast op verwijzingen naar objecten van het type String, wordt de inhoud van de strings zelf op gelijkheid vergeleken. Hetzelfde geldt voor de !=-operator. Wanneer het wordt toegepast op verwijzingen naar objecten van het type String, wordt de inhoud van de strings zelf vergeleken op ongelijkheid. Andere relationele operatoren, waaronder =, vergelijken verwijzingen naar objecten van het type String echter op dezelfde manier als verwijzingen naar objecten van andere typen. En om te controleren of de ene string groter is dan de andere, moet je de Compare()-methode aanroepen die is gedefinieerd in de String-klasse. Zoals duidelijk zal worden, zijn veel soorten tekenreeksvergelijkingen afhankelijk van culturele informatie. Maar dit geldt niet voor de operatoren == en !=. Ze vergelijken immers eenvoudigweg de ordinale waarden van karakters in strings. (Met andere woorden, ze vergelijken de binaire waarden van karakters die niet zijn gewijzigd door culturele normen, dat wil zeggen lokale normen.) Daarom voeren deze operators tekenreeksvergelijkingen uit op een hoofdletterongevoelige en cultuurongevoelige manier. Methoden voor stringklassenDe volgende tabel bevat een aantal van de meest interessante methoden in deze klasse, gegroepeerd op doel:
Het volgende voorbeeldprogramma gebruikt verschillende van de bovenstaande methoden: Systeem gebruiken; met behulp van System.Collections.Generic; met behulp van System.Linq; met behulp van System.Text; naamruimte ConsoleApplication1 ( class Program ( static void Main(string args) ( // Vergelijk de eerste twee regels string s1 = "dit is een string"; string s2 = "dit is tekst, en dit is een string"; if (String. CompareOrdinal(s1, s2) != 0) Console.WriteLine("Strings s1 en s2 zijn niet gelijk"); ("Ze bevatten echter dezelfde tekst"); // Aaneenschakeling van tekenreeksen Console.WriteLine(String.Concat("\n" + "Eén, twee", "drie, vier") // Zoeken in een tekenreeks / / Eerste keer dat een subtekenreeks voorkomt if (s2. IndexOf("this") != -1) Console.WriteLine("Het woord \"this\" wordt gevonden in de regel, het is "+ "gelegen op: (0) position", s2.IndexOf("this")); / Laatste exemplaar van de subtekenreeks if (s2.LastIndexOf("this") != -1) Console.WriteLine("Het laatste exemplaar van het woord \"this\" is " + "op (0) positie", s2.LastIndexOf("this" )); // Zoeken vanuit een reeks tekens char myCh = ("Y", "x", "t"); if (s2. IndexOfAny(myCh) != -1) Console.WriteLine("Een van de tekens uit de array ch "+ "gevonden in de huidige regel op positie (0)", s2.IndexOfAny(myCh)); // Bepaal of de regel begint met de opgegeven substring if (s2.StartsWith("this is text") == true) Console.WriteLine("Substring gevonden!"); // Bepaal of de string een substring bevat // gebruik het voorbeeld van het bepalen van de OS-string van de gebruiker myOS = Environment.OSVersion.ToString(); if (myOS.Contains("NT 5.1")) Console.WriteLine("Uw besturingssysteem is Windows XP"); else if (myOS.Contains("NT 6.1")) Console.WriteLine("Uw besturingssysteem is Windows 7"); Console.ReadLine(); ) ) ) Een beetje over stringvergelijking in C#Waarschijnlijk de meest voorkomende van alle tekenreeksbewerkingen is het vergelijken van de ene tekenreeks met de andere. Voordat we kijken naar methoden voor het vergelijken van tekenreeksen, is het de moeite waard om het volgende te benadrukken: Tekenreeksvergelijkingen kunnen in het .NET Framework op twee manieren worden uitgevoerd: Ten eerste kan de vergelijking de gewoonten en normen van een bepaalde culturele omgeving weerspiegelen, wat vaak culturele settings zijn die een rol gaan spelen wanneer het programma wordt geïmplementeerd. Dit is standaardgedrag voor sommige, maar niet alle, vergelijkingsmethoden. En ten tweede kan de vergelijking, ongeacht de culturele instellingen, alleen worden gemaakt op basis van de ordinale waarden van de karakters waaruit de string bestaat. Over het algemeen gebruiken niet-culturele vergelijkingen van strings de lexicografische volgorde (en taalkundige kenmerken) om te bepalen of een string groter, kleiner dan of gelijk is aan een andere string. Bij ordinale vergelijking worden de strings eenvoudigweg geordend op basis van de ongewijzigde waarde van elk teken. Vanwege de verschillen in de manier waarop culturele tekenreeksvergelijkingen en ordinale vergelijkingen verschillen, en de consequenties van elke dergelijke vergelijking, raden we u ten zeerste aan de best practices te volgen die momenteel door Microsoft worden aangeboden. Het kiezen van de verkeerde methode voor het vergelijken van strings kan immers leiden tot een onjuiste werking van het programma wanneer het wordt gebruikt in een andere omgeving dan waarin het is ontwikkeld. Kiezen hoe tekenreeksen moeten worden vergeleken, is een zeer belangrijke beslissing. Als algemene regel, en zonder uitzondering, moet u ervoor kiezen om tekenreeksen op een cultureel gevoelige manier te vergelijken als dit wordt gedaan met het doel het resultaat aan de gebruiker weer te geven (bijvoorbeeld om een reeks tekenreeksen weer te geven, gesorteerd in lexicografische volgorde). Maar als de strings vaste informatie bevatten die niet mag worden aangepast vanwege culturele verschillen, zoals een bestandsnaam, trefwoord, websiteadres of beveiligingswaarde, dan moet je kiezen voor ordinale stringvergelijking. Uiteraard zullen de kenmerken van de specifieke applicatie die wordt ontwikkeld de keuze bepalen van een geschikte methode voor het vergelijken van tekenreeksen. De klasse String biedt verschillende methoden voor het vergelijken van tekenreeksen, die in de bovenstaande tabel worden vermeld. De meest universele daarvan is de Compare()-methode. Hiermee kunnen twee tekenreeksen geheel of gedeeltelijk worden vergeleken, hoofdlettergevoelig of hoofdletterongevoelig, op een manier die wordt gespecificeerd door de parameter type Tekenreeksvergelijking, evenals culturele informatie die wordt verstrekt door de parameter type CultuurInfo. De overbelastingen van de Compare()-methode die geen parameter van het type StringComparison bevatten, voeren een hoofdletter- en cultuurgevoelige vergelijking van tekenreeksen uit. En in de overbelaste varianten die geen CultureInfo-typeparameter bevatten, wordt informatie over de culturele omgeving bepaald door de huidige runtime-omgeving. Het type StringComparison is een opsomming die de waarden definieert die in de onderstaande tabel worden weergegeven. Met behulp van deze waarden kunt u tekenreeksvergelijkingen maken die passen bij de behoeften van uw specifieke toepassing. Daarom breidt het toevoegen van een parameter van het type StringComparison de mogelijkheden van de Compare()-methode en andere vergelijkingsmethoden zoals Equals() uit. Dit maakt het ook mogelijk om eenduidig aan te geven hoe strings vergeleken moeten worden. Vanwege de verschillen tussen cultureel gevoelige stringvergelijkingen en ordinale vergelijkingen is het belangrijk om in dit opzicht zo nauwkeurig mogelijk te zijn.
In ieder geval retourneert de methode Compare() een negatieve waarde als de eerste vergeleken tekenreeks kleiner is dan de tweede; positief als de eerste vergeleken string groter is dan de tweede; en tenslotte nul als beide strings die worden vergeleken gelijk zijn. Hoewel de methode Compare() nul retourneert als de tekenreeksen die worden vergeleken gelijk zijn, is het over het algemeen beter om de methode Equals() of de operator == te gebruiken om te bepalen of tekenreeksen gelijk zijn. Feit is dat de Compare()-methode de gelijkheid van de vergeleken strings bepaalt op basis van hun sorteervolgorde. Als er dus een culturele vergelijking wordt gemaakt tussen strings, kunnen beide strings hetzelfde zijn in hun sorteervolgorde, maar niet gelijk in essentie. Standaard wordt stringgelijkheid bepaald in de Equals()-methode, op basis van de ordinale waarden van de karakters en zonder rekening te houden met de culturele omgeving. Daarom worden beide tekenreeksen in deze methode standaard met elkaar vergeleken voor absolute, teken-voor-teken gelijkheid, vergelijkbaar met hoe dit wordt gedaan in de == operator. Ondanks de grote veelzijdigheid van de Compare()-methode, is het voor eenvoudige ordinale vergelijkingen van tekenreeksen eenvoudiger om de CompareOrdinal()-methode te gebruiken. Houd er ten slotte rekening mee dat de methode CompareTo() alleen cultureel gevoelige tekenreeksvergelijkingen uitvoert. Het volgende programma demonstreert het gebruik van de methoden Compare(), Equals(), CompareOrdinal() en de operatoren == en != om tekenreeksen te vergelijken. Merk op dat de eerste twee vergelijkingsvoorbeelden duidelijk de verschillen aantonen tussen cultureel gevoelige stringvergelijkingen en ordinale vergelijkingen in een Engelssprekende omgeving: Systeem gebruiken; class Voorbeeld ( static void Main() ( string str1 = "alpha"; string str2 = "Alpha"; string str3 = "Beta"; string str4 = "alpha"; string str5 = "alpha, beta"; int resultaat; / / Demonstreer eerst de verschillen tussen cultuurgevoelige tekenreeksvergelijking // en ordinaal vergelijkingsresultaat = String.Compare(str1, str2, StringComparison.CurrentCulture); (str1 + " groter dan " + str2); Console.WriteLine(str1 + " gelijk aan " + str2); resultaat = String.Compare(str1, str2, StringComparison.Ordinal); ) Console.WriteLine(str1 + " groter dan " + str2); Console.WriteLine(str1 + " gelijk aan " + str4); // Gebruik de CompareOrdinal()-methode resultaat = String.CompareOrdinal( str1, str2); .Write("Teksten vergelijken met CompareOrdinal():\n"); (resultaat 0) Console.WriteLine(str1 + " groter dan " + str2); Console.WriteLine(); // Bepaal de gelijkheid van tekenreeksen met behulp van de == operator // Dit is een ordinale vergelijking van tekenreeksen if (str1 == str4) Console.WriteLine(str1 + " == " + str4); // Definieer lijnongelijkheid met behulp van de != operator if(str1 != str3) Console.WriteLine(str1 + " != " + str3); if(str1 != str2) Console.WriteLine(str1 + " != " + str2); Console.WriteLine(); // Voer een niet-hoofdlettergevoelige ordinale vergelijking van tekenreeksen uit // met behulp van de Equals()-methode if(String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase)) Console.WriteLine("Vergelijking van tekenreeksen met behulp van de Equals()-methode met de " + "OrdinalIgnoreCase-parameter: \n" + str1 + "is gelijk aan " + str2); Console.WriteLine(); // Vergelijk delen van strings if(String.Compare(str2, 0, str5, 0, 3, StringComparison.CurrentCulture) > 0) ( Console.WriteLine("Vergelijk strings rekening houdend met de huidige culturele omgeving:" + "\n3 eerste tekens van de string " + str2 + " meer dan de eerste 3 tekens van de regel " + str5); ) ) ) Het uitvoeren van dit programma levert de volgende uitvoer op: |