Maak een functie om tekenreeksen te verwerken. c. Tekenreeksen in C-taal

Tekenreeksen declareren

Een string in de C-taal is een eendimensionale reeks karakters, 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 stringparameter 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 int main() ( char s; char *p; p=gets(s); printf(" \n De string %s is ingevoerd.",s); if (p) printf(" \n De string %s is ingevoerd.", p); return 0; )

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 #erbij betrekken #erbij betrekken int main() ( char s; int x, err; do ( printf(" \n Voer een geheel getal in -> "); get(s); err=sscanf(s, "%d",&x); if (err !=1) printf(" \n Invoerfout. " ) while (err!=1); printf("\n Geheel getal ingevoerd -> %d", x )

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 doorgegeven "%s". 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 strings

Om 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

  Een string is een reeks ASCII- of UNICODE-tekens. Snaren in C, zoals in de meeste programmeertalen op hoog niveau, worden beschouwd als een afzonderlijk type dat is opgenomen in het systeem van basistypen van de taal. Omdat de SI-taal van oorsprong een systeemprogrammeertaal is, zit er als zodanig geen tekenreeksgegevenstype in en worden gewone karakterarrays gebruikt als tekenreeksen in C.
  Historisch gezien zijn er twee representaties van het tekenreeksformaat geweest:
   1. ANSI-formaat;
   2. op nul eindigende strings (gebruikt in SI).

Het ANSI-formaat stelt dat de betekenis van de eerste positie in een string de lengte is, gevolgd door de tekens van de string zelf. Als u bijvoorbeeld de tekenreeks 'Mijn tekenreeks!' zal als volgt zijn:
   11 ‘M’ ‘o’ ‘i’ ‘ ’ ‘s’ ‘t’ ‘r’ ‘o’ ‘k’ ‘a’ ‘!’
  In tekenreeksen die op nul eindigen, worden de significante tekens van de tekenreeks gespecificeerd vanaf de eerste positie, en is de tekenreeksterminator de waarde nul. De weergave van de eerder besproken string in dit formaat ziet er als volgt uit:
   ‘M’ ‘o’ ‘i’ ‘ ’ ‘s’ ‘t’ ‘r’ ‘o’ ‘k’ ‘a’ ‘!’ 0

Strings declareren in SI


  Strings worden geïmplementeerd met behulp van karakterarrays. Daarom heeft het declareren van een ASCII-reeks de volgende syntaxis:
   tekennaam[lengte];  Aankondiging snaren in C heeft dezelfde syntaxis als een eendimensionale karakterarraydeclaratie. De lengte van de string moet een geheel getal zijn (in de C89-standaard is het een constante, in de C99-standaard kan het een uitdrukking zijn). De lengte van een tekenreeks wordt gespecificeerd met één teken om de afsluitende nul op te slaan, dus het maximale aantal significante tekens in een tekenreeks is één minder dan de lengte ervan. Een string kan bijvoorbeeld maximaal twintig tekens bevatten als deze als volgt wordt gedeclareerd:
   teken str;  
Initialisatie van een string in C wordt uitgevoerd wanneer deze wordt gedeclareerd, met behulp van de volgende syntaxis:   char str[lengte] = letterlijke tekenreeks;
  Een letterlijke tekenreeks is een reeks ASCII-tekens tussen dubbele aanhalingstekens. Voorbeelden van het declareren van strings met initialisatie:   char str1 = "Voer waarde in: ", str2 = "";
  Voorbeeld:

   const char message = "Foutmelding!";


Werken met strings in SI
  Omdat SI-strings arrays van karakters zijn, kan elk karakter in een string benaderd worden via zijn index. Dit wordt gedaan met behulp van de syntaxis van array-elementen, zodat het eerste teken in de string index nul heeft. In het volgende programmafragment in de regel str worden bijvoorbeeld alle tekens 'a' vervangen door de tekens 'A' en omgekeerd.
  {
   for(int i=0;str[i]!=0;i++)
    als(str[i] == ‘a’) str[i] = ‘A’;
  }

     anders if(str[i] == ‘A’) str[i] = ‘a’;


Stringarrays in SI
  Het declareren van stringarrays in SI is ook mogelijk. Om dit te doen, worden tweedimensionale karakterarrays gebruikt, die de volgende syntaxis hebben:  char-naam[hoeveelheid][lengte];
  De eerste grootte van de matrix geeft het aantal rijen in de array aan, en de tweede geeft de maximale lengte (inclusief de eindnul) van elke rij aan. Het declareren van een array van vijf strings met een maximale lengte van 30 significante tekens zou er bijvoorbeeld als volgt uitzien:
   tekenstrs;  
Bij het declareren van arrays met strings kunt u initialisatie uitvoeren:
   char naam[hoeveelheid][lengte] =
    (tekenreeks letterlijk #1, ... tekenreeks letterlijk #N);
  Het aantal letterlijke tekenreeksen moet kleiner zijn dan of gelijk zijn aan het aantal tekenreeksen in de array. Als het aantal letterlijke tekenreeksen kleiner is dan de grootte van de array, worden alle resterende elementen geïnitialiseerd naar lege tekenreeksen. De lengte van elke letterlijke tekenreeks moet strikt kleiner zijn dan de lengte van de tekenreeks (om de afsluitende nul vast te leggen).
Bijvoorbeeld:
   char dagen = (
    "januari", "februari", "maart", "april", "mei",
  };
  Bij het declareren van arrays van strings met initialisatie is het mogelijk om het aantal strings niet tussen vierkante haken aan te geven. In dit geval wordt het aantal strings in de array automatisch bepaald door het aantal initialiserende stringliterals.
Bijvoorbeeld een array van zeven regels:
  Het aantal letterlijke tekenreeksen moet kleiner zijn dan of gelijk zijn aan het aantal tekenreeksen in de array. Als het aantal letterlijke tekenreeksen kleiner is dan de grootte van de array, worden alle resterende elementen geïnitialiseerd naar lege tekenreeksen. De lengte van elke letterlijke tekenreeks moet strikt kleiner zijn dan de lengte van de tekenreeks (om de afsluitende nul vast te leggen).
    "Maandag", "Dinsdag", "Woensdag", "Donderdag",
    "Vrijdag", "Zaterdag", "Zondag"
  };

Functies voor het werken met strings in SI


  Alle bibliotheekfuncties die zijn ontworpen om met strings te werken, kunnen in drie groepen worden verdeeld:
   1. invoer en uitvoer van strings;
   2. stringconversie;
   3. stringverwerking.

Invoer en uitvoer van strings in SI


  U kunt de geformatteerde invoer- en uitvoerfuncties (printf en scanf) gebruiken om tekenreeksinformatie in te voeren en uit te voeren. Om dit te doen, moet u bij het invoeren of uitvoeren van een stringvariabele de %s typespecificatie opgeven in de opmaakregel. De invoer en daaropvolgende uitvoer van een stringvariabele zou er bijvoorbeeld als volgt uitzien:
   charstr = "";
   printf("Voer de tekenreeks in: ");
   scanf("%30s”,str);
   printf("Je hebt ingevoerd: %s”,str);
  Het nadeel van de scanf-functie bij het invoeren van stringgegevens is dat de scheidingstekens voor deze functie de volgende zijn:
   1. regelinvoer,
   2. tabellering;
   3. ruimte.
Daarom is het met deze functie onmogelijk om een ​​string in te voeren die meerdere woorden bevat, gescheiden door spaties of tabs. Als de gebruiker in het vorige programma bijvoorbeeld de regel invoert: 'Bericht van meerdere woorden', wordt alleen 'Bericht' op het scherm weergegeven.
  Voor invoer en uitvoer van strings bevat de stdio.h-bibliotheek gespecialiseerde functies get en puts.

De get-functie is voor het invoeren van tekenreeksen en heeft de volgende header:
   char * krijgt(char *buffer);

  De puts-functie is ontworpen om strings af te drukken en heeft de volgende header:
   int puts(const char *string);  Het eenvoudigste programma: invoer en uitvoer van een string met behulp van de functies get en puts ziet er als volgt uit:
   charstr = "";
   printf("Voer de tekenreeks in: "); krijgt(str);
   printf("Je hebt ingevoerd: ");
   zet(str);
  Naast de functies voor invoer en uitvoer naar streams, bevat de stdio.h-bibliotheek functies voor geformatteerde invoer en uitvoer naar strings. De geformatteerde invoer van de stringfunctie heeft de volgende header:
   int sscanf(const char * buffer beperken,const char * tekenreeks beperken, ...);  De geformatteerde tekenreeksuitvoerfuncties hebben de volgende headers:
   int sprintf(char * buffer beperken,

   int snprintf(char * buffer beperken, size_t maxsize,
   const char * formaat beperken, ...);

String-conversie


  In SI voor het converteren van tekenreeksen die getallen bevatten naar numerieke waarden in de stdlib.h-bibliotheek
De volgende reeks functies is beschikbaar:
   dubbele atof(const char *string); // een string omzetten naar een dubbel getal
   int atoi(const char *string); // een string converteren naar een getal van het type int
   long int atol(const char *string); // een string converteren naar een lang int-nummer
   long long int atol(const char *string); // een string omzetten naar een getal van het type long long   int
  De juiste weergave van een reëel getal in een tekststring moet voldoen aan het formaat:
   [(+|-)][cijfers][.cijfers][(e|E)[(+|-)]cijfers]

Na de symbolen E, e wordt de volgorde van het getal aangegeven. De juiste weergave van een geheel getal in een tekststring moet voldoen aan het formaat:
   [(+|-)] getallen

Naast de bovenstaande functies zijn de volgende functies voor het converteren van tekenreeksen naar reële getallen ook beschikbaar in de stdlib.h-bibliotheek:
   float strtof(const char * string beperken, char ** endptr beperken);
   double strtod(const char * string beperken, char ** endptr beperken);
   long double strtold(const char * restrict string,char ** limit endptr);

Soortgelijke functies zijn aanwezig voor het converteren van tekenreeksen naar gehele waarden:
   long int strtol(const char * string beperken,

   niet-ondertekende lange strtoul(const char * string beperken,
   char ** beperken endptr, int base);
   long long int strtoll(const char * beperken string,
   char ** beperken endptr, int base);
   niet-ondertekend lang lang strtoull(const char * restrict string,char ** limit endptr, int base);

Inverse conversiefuncties (numerieke waarden naar strings) zijn aanwezig in de stdlib.h-bibliotheek, maar worden niet door de standaard geregeld en worden niet in aanmerking genomen. Om numerieke waarden naar stringwaarden om te zetten, is het het handigst om de functies sprintf en snprintf te gebruiken.

Tekenreeksverwerking


  De string.h-bibliotheek bevat functies voor verschillende acties op strings.
Functie voor het berekenen van de stringlengte:
   size_t strlen(const char *string); Voorbeeld:
   char str = "1234";
   int n = strlen(str); //n == 4
  Functies voor het kopiëren van tekenreeksen:
   char * strcpy(char * dst beperken, const char * src beperken);
   char * strncpy(char * dst beperken, const char * src beperken, size_t num);
  Functies voor stringvergelijking:
   int strcmp(const char *string1, const char *string2);
   int strncmp(const char *string1, const char *string2,size_t num);
  De functies vergelijken tekenreeksen alfabetisch en retourneren:
   positieve waarde – als string1 groter is dan string2;
   negatieve waarde – als string1 kleiner is dan string2;
   nulwaarde – als string1 overeenkomt met string2;

Functies voor het combineren (samenvoegen) van strings:
   char * strcat(char * dst beperken, const char * src beperken);
   char * strncat(char * dst beperken, const char * src beperken, size_t num);

Functies voor het zoeken naar een teken in een string:
   char * strchr(const char *string, int c);
   char * strrchr(const char *string, int c);

Functie om te zoeken naar een string in een string:
   char * strstr(const char *str, const char *substr);

Voorbeeld:
   char str = "String om te zoeken";
   char *str1 = strstr(str,"voor"); //str1 == "voor zoeken"

Functie om het eerste teken in een string uit een bepaalde tekenset te vinden:
   size_t strcspn(const char *str, const char *charset);

Functies voor het zoeken naar het eerste teken in een string die niet tot een bepaalde tekenset behoort:
   size_t strspn(const char *str, const char *charset);

Functies voor het zoeken naar het eerste teken in een string uit een bepaalde tekenset:
   char * strpbrk(const char *str, const char *charset);

Functie om de volgende letterlijke waarde in een string te vinden:
   char * strtok(char * string beperken, const char * karakterset beperken);

Habra, hallo!

Nog niet zo lang geleden overkwam mij een nogal interessant incident, waarbij een van de docenten van een computerwetenschappenschool betrokken was.

Het gesprek over Linux-programmering ging langzaam over in de richting van deze persoon die betoogde dat de complexiteit van systeemprogrammering eigenlijk enorm overdreven was. Dat de C-taal zo simpel is als een lucifer, in feite net als de Linux-kernel (in zijn woorden).

Ik had een laptop met Linux bij me, die een herenset hulpprogramma's bevatte voor ontwikkeling in de C-taal (gcc, vim, make, valgrind, gdb). Ik weet niet meer welk doel we onszelf toen hadden gesteld, maar na een paar minuten zat mijn tegenstander achter deze laptop, helemaal klaar om het probleem op te lossen.

En letterlijk op de allereerste regels maakte hij een ernstige fout bij het toewijzen van geheugen aan... een regel.

Char *str = (char *)malloc(groottevan(char) * strlen(buffer));
buffer - een stapelvariabele waarin gegevens van het toetsenbord zijn geschreven.

Ik denk dat er zeker mensen zullen zijn die zullen vragen: “Hoe kan hier iets mis mee zijn?”
Geloof me, dat kan.

En wat precies - lees over de kat.

Een beetje theorie - een soort LikBez.

Als u het weet, bladert u naar de volgende kop.

Een string in C is een array van karakters, die altijd moet eindigen met een "\0" - het teken aan het einde van de regel. Tekenreeksen op de stapel (statisch) worden als volgt gedeclareerd:

Char str[n] = ( 0 );
n is de grootte van de karakterarray, hetzelfde als de lengte van de string.

Toewijzing ( 0 ) - de string op nul zetten (optioneel, u kunt deze zonder deze declareren). Het resultaat is hetzelfde als het uitvoeren van de functies memset(str, 0, sizeof(str)) en bzero(str, sizeof(str)). Het wordt gebruikt om te voorkomen dat er rommel achterblijft in niet-geïnitialiseerde variabelen.

Je kunt ook onmiddellijk een string op de stapel initialiseren:

Char buf = "standaard buffertekst\n";
Bovendien kan een string als pointer worden gedeclareerd en kan er geheugen voor worden toegewezen op de heap:

Char *str = malloc(grootte);
size - het aantal bytes dat we toewijzen aan de string. Dergelijke strings worden dynamisch genoemd (vanwege het feit dat de vereiste grootte dynamisch wordt berekend + de toegewezen geheugengrootte op elk moment kan worden vergroot met behulp van de realloc() functie).

In het geval van een stapelvariabele heb ik de notatie n gebruikt om de grootte van de array te bepalen; in het geval van een heapvariabele heb ik de notatie grootte gebruikt. En dit weerspiegelt perfect de ware essentie van het verschil tussen een declaratie op de stapel en een declaratie met geheugentoewijzing op de heap, omdat n meestal wordt gebruikt als het over het aantal elementen gaat. En grootte is een heel ander verhaal...

Valgrind zal ons helpen

In mijn vorige artikel noemde ik het ook. Valgrind (, twee - een kleine how-to) is een zeer nuttig programma dat de programmeur helpt geheugenlekken en contextfouten op te sporen - precies de dingen die het vaakst opduiken bij het werken met strings.

Laten we eens kijken naar een korte lijst die iets implementeert dat lijkt op het programma dat ik noemde en het door valgrind laten lopen:

#erbij betrekken #erbij betrekken #erbij betrekken #define HELLO_STRING "Hallo, Habr!\n" void main() ( char *str = malloc(sizeof(char) * strlen(HELLO_STRING)); strcpy(str, HELLO_STRING); printf("->\t%s" , str);
En in feite het resultaat van het programma:

$ gcc main.c $ ./a.out -> Hallo, Habr!
Nog niets ongewoons. Laten we dit programma nu uitvoeren met valgrind!

$ valgrind --tool=memcheck ./a.out ==3892== Memcheck, een geheugenfoutdetector ==3892== Copyright (C) 2002-2015, en GNU GPL"d, door Julian Seward et al. == 3892== Valgrind-3.12.0 en LibVEX gebruiken; opnieuw uitvoeren met -h voor copyright-info ==3892== Commando: ./a.out ==3892== ==3892== Ongeldig schrijven van grootte 2 ==3892= = bij 0x4005B4: main (in /home/indever/prg/C/public/a.out) ==3892== Adres 0x520004c is 12 bytes binnen een blok van grootte 13 alloc"d ==3892== bij 0x4C2DB9D: malloc (vg_replace_malloc.c:299) ==3892== door 0x400597: main (in /home/indever/prg/C/public/a.out) ==3892== ==3892== Ongeldige lezing van maat 1 == 3892== bij 0x4C30BC4: strlen (vg_replace_strmem.c:454) ==3892== door 0x4E89AD0: vfprintf (in /usr/lib64/libc-2.24.so) ==3892== door 0x4E90718: printf (in /usr/ lib64/libc-2.24.so) ==3892== door 0x4005CF: main (in /home/indever/prg/C/public/a.out) ==3892== Adres 0x520004d is 0 bytes na een blok van grootte 13 alloc"d ==3892== bij 0x4C2DB9D: malloc (vg_replace_malloc.c:299) ==3892== door 0x400597: main (in /home/indever/prg/C/public/a.out) ==3892== -> Hallo, Habr! ==3892== ==3892== HEAP SAMENVATTING: ==3892== in gebruik bij afsluiten: 0 bytes in 0 blokken ==3892== totaal heapgebruik: 2 allocs, 2 frees, 1.037 bytes toegewezen ==3892= = ==3892== Alle heap-blokken zijn vrijgegeven - er zijn geen lekken mogelijk ==3892== ==3892== Voor tellingen van gedetecteerde en onderdrukte fouten, herhaalt u met: -v ==3892== FOUTSAMENVATTING: 3 fouten uit 2 contexten (onderdrukt: 0 uit 0)
==3892== Alle heap-blokken zijn vrijgegeven - er zijn geen lekken mogelijk- er zijn geen lekken, en dat is goed nieuws. Maar het is de moeite waard om je ogen wat lager te houden (hoewel ik wil opmerken dat dit slechts een samenvatting is, de belangrijkste informatie staat op een iets andere plaats):

==3892== FOUTSAMENVATTING: 3 fouten uit 2 contexten (onderdrukt: 0 uit 0)
3 fouten. In 2 contexten. In zo'n eenvoudig programma. Hoe!?

Ja, heel simpel. Het hele “grappige” is dat de strlen-functie geen rekening houdt met het teken aan het einde van de regel - “\0”. Zelfs als u dit expliciet opgeeft in de binnenkomende regel (#define HELLO_STRING “Hallo, Habr!\n\0”), zal het worden genegeerd.

Net boven het resultaat van de programma-uitvoering, de lijn -> Hallo, Habr! er is een gedetailleerd rapport van wat en waar onze dierbare valgrind niet leuk vond. Ik stel voor dat u zelf naar deze lijnen kijkt en uw eigen conclusies trekt.

Eigenlijk zal de juiste versie van het programma er als volgt uitzien:

#erbij betrekken #erbij betrekken #erbij betrekken #define HELLO_STRING "Hallo, Habr!\n" void main() ( char *str = malloc(sizeof(char) * (strlen(HELLO_STRING) + 1)); strcpy(str, HELLO_STRING); printf("->\ t%s", str); gratis(str); )
Laten we het door valgrind halen:

$ valgrind --tool=memcheck ./a.out -> Hallo, Habr! ==3435== ==3435== HEAP SAMENVATTING: ==3435== in gebruik bij afsluiten: 0 bytes in 0 blokken ==3435== totaal heapgebruik: 2 allocs, 2 frees, 1.038 bytes toegewezen ==3435= = ==3435== Alle heap-blokken zijn vrijgegeven - er zijn geen lekken mogelijk ==3435== ==3435== Voor tellingen van gedetecteerde en onderdrukte fouten, voer het programma opnieuw uit met: -v ==3435== FOUTSAMENVATTING: 0 fouten vanaf 0 contexten (onderdrukt: 0 vanaf 0)
Geweldig. Er zijn geen fouten, +1 byte toegewezen geheugen heeft het probleem opgelost.

Wat interessant is, is dat in de meeste gevallen zowel het eerste als het tweede programma hetzelfde zullen werken, maar als het geheugen dat was toegewezen aan de regel waarin het eindteken niet paste niet op nul was gezet, dan zou de functie printf() bij het uitvoeren van zo'n regel , zal ook al het afval na deze regel uitvoeren - alles zal worden afgedrukt totdat een teken aan het einde van de regel printf() in de weg staat.

Weet je echter, (strlen(str) + 1) is zo'n oplossing. Wij worden geconfronteerd met 2 problemen:

  1. Wat als we geheugen moeten toewijzen aan een string die is gegenereerd met bijvoorbeeld s(n)printf(..)? Wij ondersteunen de argumenten niet.
  2. Verschijning. De variabele declaratieregel ziet er gewoon verschrikkelijk uit. Sommige jongens slagen er ook in om (char *) aan malloc te hechten, alsof ze onder plussen schrijven. In een programma waarin je regelmatig strings moet verwerken, is het logisch om een ​​elegantere oplossing te vinden.
Laten we een oplossing bedenken die zowel ons als Valgrind tevreden zal stellen.

snprintf()

int snprintf(char *str, size_t size, const char *format, ...);- een functie - een uitbreiding van sprintf, die een string opmaakt en naar de pointer schrijft die als eerste argument is doorgegeven. Het verschilt van sprintf() doordat str geen byte schrijft die groter is dan de opgegeven grootte.

De functie heeft één interessant kenmerk: het retourneert in ieder geval de grootte van de gegenereerde string (zonder rekening te houden met het teken aan het einde van de regel). Als de string leeg is, wordt 0 geretourneerd.

Een van de problemen die ik heb beschreven bij het gebruik van strlen heeft betrekking op de functies sprintf() en snprintf(). Laten we aannemen dat we iets in de string str moeten schrijven. De laatste regel bevat de waarden van de andere variabelen. Onze inzending zou er ongeveer zo uit moeten zien:

Char * str = /* wijs hier geheugen toe */; sprintf(str, "Hallo, %s\n", "Habr!");
De vraag rijst: hoe bepaal je hoeveel geheugen moet worden toegewezen aan de string str?

Char * str = malloc(groottevan(char) * (strlen(str, "Hallo, %s\n", "Habr!") + 1));

#erbij betrekken - het zal niet werken. Het prototype van de functie strlen() ziet er als volgt uit:
const char *s betekent niet dat de string die wordt doorgegeven aan s een string met variadisch formaat kan zijn.

De nuttige eigenschap van de functie snprintf(), die ik hierboven noemde, zal ons hier helpen. Laten we eens kijken naar de code voor het volgende programma:

#erbij betrekken #erbij betrekken #erbij betrekken void main() ( /* Omdat snprintf() geen rekening houdt met het teken aan het einde van de regel, voegen we de grootte ervan toe aan het resultaat */ size_t require_mem = snprintf(NULL, 0, "Hallo, %s!\n", "Habr") + sizeof("\0"); char *str = malloc(needed_mem(str, benodigde_mem, "Hallo, %s!\n", "Habr"); ;
Voer het programma uit in Valgrind:

$ valgrind --tool=memcheck ./a.out -> Hallo, Habr! ==4132== ==4132== HEAP SAMENVATTING: ==4132== in gebruik bij afsluiten: 0 bytes in 0 blokken ==4132== totaal heapgebruik: 2 allocs, 2 frees, 1.041 bytes toegewezen ==4132= = ==4132== Alle heap-blokken zijn vrijgegeven - er zijn geen lekken mogelijk ==4132== ==4132== Voor tellingen van gedetecteerde en onderdrukte fouten, herhaalt u met: -v ==4132== FOUTSAMENVATTING: 0 fouten uit 0 contexten (onderdrukt: 0 uit 0) $
Geweldig. Wij hebben argumentatieondersteuning. Omdat we null als tweede argument doorgeven aan de functie snprintf(), zal het schrijven naar een null-pointer nooit een Seagfault veroorzaken. Desondanks retourneert de functie nog steeds de vereiste grootte voor de string.

Maar aan de andere kant moesten we een extra variabele introduceren, en wel het ontwerp

Size_t require_mem = snprintf(NULL, 0, "Hallo, %s!\n", "Habr") + sizeof("\0");
ziet er nog slechter uit dan in het geval van strlen().

Over het algemeen kan + sizeof("\0") worden verwijderd als u expliciet "\0" opgeeft aan het einde van de opmaakregel (size_t require_mem = snprintf(NULL, 0, "Hallo, %s!\n \0 ", "Habr");), maar dit is lang niet altijd mogelijk (afhankelijk van het stringverwerkingsmechanisme kunnen we een extra byte toewijzen).

We moeten iets doen. Ik dacht een beetje na en besloot dat dit het moment was om een ​​beroep te doen op de wijsheid van de Ouden. Laten we een macrofunctie beschrijven die snprintf() aanroept met een null-aanwijzer als eerste argument, en null als tweede. En laten we het einde van de rij niet vergeten!

#define strsize(args...) snprintf(NULL, 0, args) + sizeof("\0")
Ja, het kan voor sommigen nieuws zijn, maar C-macro's ondersteunen een variabel aantal argumenten, en de ellips vertelt de preprocessor dat het opgegeven macrofunctie-argument (in ons geval args) overeenkomt met verschillende echte argumenten.

Laten we onze oplossing in de praktijk bekijken:

#erbij betrekken #erbij betrekken #erbij betrekken #define strsize(args...) snprintf(NULL, 0, args) + sizeof("\0") void main() ( char *str = malloc(strsize("Hallo, %s\n", "Habr! ")); sprintf(str, "Hallo, %s\n", "Habr!"); printf("->\t%s", str); free(str); )
Laten we beginnen met valgrund:

$ valgrind --tool=memcheck ./a.out -> Hallo, Habr! ==6432== ==6432== HEAP SAMENVATTING: ==6432== in gebruik bij afsluiten: 0 bytes in 0 blokken ==6432== totaal heapgebruik: 2 allocs, 2 frees, 1.041 bytes toegewezen ==6432= = ==6432== Alle heap-blokken zijn vrijgegeven - er zijn geen lekken mogelijk ==6432== ==6432== Voor tellingen van gedetecteerde en onderdrukte fouten, herhaalt u met: -v ==6432== FOUTSAMENVATTING: 0 fouten vanaf 0 contexten (onderdrukt: 0 vanaf 0)
Ja, er zijn geen fouten. Alles klopt. En valgrind is blij, en de programmeur kan eindelijk gaan slapen.

Maar tot slot wil ik nog één ding zeggen. In het geval dat we geheugen moeten toewijzen aan een string (zelfs met argumenten), is dat al het geval volledig werkende oplossing.

We hebben het over de asprintf-functie:

#define _GNU_SOURCE /* Zie feature_test_macros(7) */ #include int asprintf(char **strp, const char *fmt, ...);
Het neemt een pointer naar een string (**strp) als zijn eerste argument en wijst geheugen toe aan de pointer waarvan de verwijzingen zijn verwijderd.

Ons programma geschreven met asprintf() ziet er als volgt uit:

#erbij betrekken #erbij betrekken #erbij betrekken void main() ( char *str; asprintf(&str, "Hallo, %s!\n", "Habr"); printf("->\t%s", str); free(str); )
En in feite, in Valgrind:

$ valgrind --tool=memcheck ./a.out -> Hallo, Habr! ==6674== ==6674== HEAP SAMENVATTING: ==6674== in gebruik bij afsluiten: 0 bytes in 0 blokken ==6674== totaal heapgebruik: 3 allocs, 3 frees, 1.138 bytes toegewezen ==6674= = ==6674== Alle heap-blokken zijn vrijgegeven -- er zijn geen lekken mogelijk ==6674== ==6674== Voor tellingen van gedetecteerde en onderdrukte fouten, voer het programma opnieuw uit met: -v ==6674== FOUTSAMENVATTING: 0 fouten vanaf 0 contexten (onderdrukt: 0 vanaf 0)
Alles is in orde, maar zoals je kunt zien, is er meer geheugen toegewezen en zijn er nu drie toewijzingen, niet twee zwakke ingebedde systemen. Het gebruik van deze functie is ongewenst.
Als we bovendien man asprintf in de console schrijven, zullen we het volgende zien:

VOLDOET AAN Deze functies zijn GNU-extensies, niet in C of POSIX. Ze zijn ook beschikbaar onder *BSD. De FreeBSD-implementatie stelt strp bij fouten in op NULL.

Dit maakt duidelijk dat deze functie alleen beschikbaar is in GNU-bronnen.

Conclusie

Concluderend wil ik zeggen dat het werken met strings in C een zeer complex onderwerp is dat een aantal nuances kent. Om bijvoorbeeld “veilige” code te schrijven bij het dynamisch toewijzen van geheugen, wordt het aanbevolen om de functie calloc() te gebruiken in plaats van malloc() - calloc vult het toegewezen geheugen met nullen. Of gebruik na het toewijzen van geheugen de functie memset(). Anders kan de rommel die zich aanvankelijk in het toegewezen geheugengebied bevond, problemen veroorzaken tijdens het debuggen en soms bij het werken met de string.

Meer dan de helft van de C-programmeurs die ik ken (de meesten van hen zijn beginners) die op mijn verzoek het probleem van het toewijzen van geheugen aan strings oplosten, deden dat op een manier die uiteindelijk tot contextfouten leidde. In één geval - zelfs met een geheugenlek (nou ja, iemand vergat free(str) te doen, het overkomt nooit iemand). Dit was voor mij de aanleiding om deze creatie te maken die je zojuist hebt gelezen.

Ik hoop dat dit artikel nuttig zal zijn voor iemand. Waarom maak ik al deze ophef? Geen enkel taalgebruik is eenvoudig. Overal heeft zijn eigen subtiliteiten. En hoe meer subtiliteiten van de taal u kent, hoe beter uw code.

Ik geloof dat na het lezen van dit artikel je code een beetje beter zal worden :)
Veel succes, Habr!

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 een 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, het aantal omzet en de 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.2018

    p»ї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 profileren als iemand met wie zij zaken willen doen.
    o Bij twijfel is het het beste om eerst vragen te stellen die hen naar voren halen 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 of bij iemand thuis zit en 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. Om uit te leggen
    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.

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:

Naamruimte 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 #erbij betrekken #erbij betrekken naamruimte std gebruiken; int main() ( string s = "Test"; s.insert(1,"!"); cout<< s.c_str() << endl; string *s2 = new string("Hello"); s2->wissen(s2->einde());<< s2->uit

c_str();

  • cin.get(); retour 0; )
  • De belangrijkste kenmerken van de stringklasse:
  • initialisatie met een karakterarray (een ingebouwd stringtype) of een ander object van het type string . Een ingebouwd type heeft de tweede mogelijkheid niet;
  • 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. snaar lengte(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"); string 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, kan worden benaderd met behulp van 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

retourneert onveranderbaar een C-karakterarray die de karakters van de string bevat

Lijncapaciteitscontrole

leeg

controleert of een string leeg is

maat
lengte

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

push_back

een teken aan het einde van een regel toevoegen

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




2024, leally.ru - Uw gids in de wereld van computers en internet