Aantal elementen in een array char

Wat voor soort functie kan ik gebruiken om te weten hoeveel elementen er in een array-char zitten?

sizeof () geeft het aantal beschikbare “spaties” aan zodat het niet “voor mij werkt.

Reacties

  • Kunt u alstublieft een voorbeeld geven? bijv. char foo [100] = "bar"; – is dat wat je bedoelt? Je wilt het antwoord: 3?
  • ja dat ' s rechts

Antwoord

U wilt strlen.

 char foo [100] = "bar"; Serial.println (strlen (foo)); // --> prints 3  

Reacties

  • Als het antwoord werkte voor u, klik op de " accepteer " knop (het lijkt op een vinkje). Op die manier zullen andere mensen weten dat de oplossing werkte.
  • Ik moest een paar minuten wachten om dat te doen
  • Merk op dat dit alleen werkt als de gegevens in je bevat een ascii-string, en is correct null-beëindigd. Bovendien, als je een lange string in de char[] hebt, en je deze overschrijft met een kortere string zonder de null-terminatie toe te voegen, krijg je de grootte van de oudere string.
  • Helemaal juist. Mijn antwoord was voor de gestelde vraag. Met de dingen die u noemt, moet rekening worden gehouden met C-strings die op null eindigen.

Answer

Ik ken je heb je antwoord van @NickGammon, maar ik “zou gewoon wat meer diepgaande informatie willen toevoegen over hoe dit allemaal werkt.

sizeof() is geen functie in de normale betekenis van het woord. Het is een operator die je het aantal bytes geheugen geeft dat is toegewezen aan datgene wat je eraan doorgeeft. Als je er een array aan doorgeeft, retourneert het het aantal bytes dat de array beschikbaar heeft. Als je het een pointer doorgeeft aan een array, dan retourneert het de grootte van die pointer, niet de grootte van de array. Als je het een integer-variabele doorgeeft, wordt het aantal bytes geretourneerd dat wordt gebruikt door die integer-variabele (2 op een systeem zoals AVR, 4 op een 32-bits systeem zoals de Due).

Dus enkele voorbeelden:

char array[50] = "hello"; // sizeof(array) = 50. char *array_p = array; // sizeof(array_p) = 2 or 4 depending on architecture. char single = "a"; // sizeof(single) = 1. char string[] = "hello"; // sizeof(string) = 6 (5 letters plus \0) - it allocates the memory at compile time to fit the string 

Nu strlen(). Hoe verschilt dat precies van sizeof()? Simpel gezegd: telt het aantal tekens in een tekenreeks totdat het teken \0 bereikt, wat het” NULL “afsluitende teken is van een C-tekenreeks. Laten we eerst de voorbeelden nemen, maar in plaats daarvan strlen gebruiken:

char array[50] = "hello"; // strlen(array) = 5. char *array_p = array; // strlen(array_p) = 5. char single = "a"; // strlen(single) = ERROR! strlen() doesn"t operate on single characters. char string[] = "hello"; // strlen(string) = 5. 

Je merkt dat het altijd het aantal tekens in de string teruggeeft tot, maar niet inclusief, het achterliggende \0 karakter.

In zijn eenvoudigste vorm zou de strlen() -functie er als volgt uit kunnen zien:

int strlen(const char *data) { int c = 0; const char *p = data; while (*p) { c++; p++; } return c; } 

Het begint in feite bij het eerste teken in de string (*p = data), onderzoekt of het “sa \0 of niet (while (*p)), verhoogt het aantal tekens (c++) en gaat verder naar het volgende teken in de string (p++).

Als je je string in je programma wilt doorlopen, kun je strlen() om eerst het aantal tekens in de string te krijgen, gebruik dan die waarde in een lus. Dat is een beetje verkwistend, aangezien strlen() eerst door de string heen itereert, dus je itereert er uiteindelijk twee keer doorheen. Het is veel efficiënter om te leren hoe u het beste door elk teken in de tekenreeks kunt stappen totdat u het afsluitende teken vindt, bijvoorbeeld hoe de functie strlen() de pointer om door het geheugen te bladeren. U kunt ook zien hoe belangrijk het is dat u ervoor zorgt dat het teken \0 aan het einde van de tekenreeks staat, hoe functioneert anders zoals strlen() weet je wanneer je moet stoppen? Ze kunnen “niet weten hoe lang de string is (sizeof() retourneert de grootte van de aanwijzer die wordt doorgegeven, niet de grootte van de array), dus moeten ze een soort van handmatige markering, en de conventie in C is om \0 te gebruiken.

Merk op dat Arduino “s print() functies eigenlijk doe het erg inefficiënt. Als je zoiets doet als:

char message[] = "Hello"; Serial.println(message); 

Het zal eigenlijk heel wat werk doen, het hoeft niet echt . Genomen stap voor stap het:

  1. roept println (bericht) aan
  2. wat write (bericht) aanroept
  3. wat de stringlengte krijgt met strlen (bericht)
  4. en aanroepen schrijven (bericht, lengte)
  5. die vervolgens doorloopt van 0 naar lengte-1 en elk teken van bericht om beurten naar write () stuurt.
  6. drukt tenslotte de \r\n af voor de nieuwe regel.

Het eindigt dus eigenlijk genest rond 4 functies diep, en herhaalt de hele string twee keer. klassiek voorbeeld van hoe u verwerkingstijd kunt verspillen.Door één keer door de string te lopen en te zoeken naar het \0 -teken in de write(message) -functie (stap 2), zou het minstens twee keer zo snel werken. Goede oude Arduino …

Opmerkingen

  • Re “In zijn eenvoudigste vorm zou de functie strlen () er zo uit kunnen zien”, in een kortere ( misschien eenvoudiger?) vorm zou het eruit kunnen zien: int strlen(const char *data) { const char *p = data; while (*p++); return p-data-1; }
  • @ jwpat7 Ik zei " eenvoudigste ", niet " kortste en meest compacte ". Die vorm, hoewel kleiner en efficiënter, is veel moeilijker voor het OP (die duidelijk geen een programmeur is) om te begrijpen.
  • Akkoord 🙂 Ook gemakkelijker om fouten te maken in . En als de \0 de laatste toegankelijke byte in een segment is, geeft de *p++ een fout. Maar int strlen(const char *data) { const char *p = data; while (*p) ++p; return p-data; } vermijdt dat probleem.
  • Eigenlijk heeft *p++ ' t-fout, zelfs als de \0 de laatste toegankelijke byte in een segment is; het *p -gedeelte zal toegang krijgen tot de laatste byte; het ++ deel zal p op een ongeldig adres zetten; maar aangezien naar dat ongeldige adres niet ' wordt verwezen, treedt er op een typische machine geen fout op.
  • Het is een macro voor compileren … Het ' is geen macro , het ' is een operator (zoals " + " en " – " zijn operators). Ze zijn van een lager niveau dan macros, wat dingen zijn die vóór de processor worden gedaan. Zie sizeof operator . Ook Operatoren in C ++

Antwoord

 use sizeof char nnn[10]; for(int i=0; i< sizeof(nnn)/sizeof(char); i++){ } 

Reacties

  • Heb je de vraag goed gelezen?
  • Het OP zei sizeof " werkt niet ' voor mij " en dan stel je voor sizeof te gebruiken.
  • kan de vraag niet beantwoorden bij gebruik van dezelfde onbekende

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *