Zoals de titel al aangeeft, is mijn vraag hoe ik de grootte van een string in C
kan krijgen. Is het goed om sizeof
te gebruiken als ik het (de string) heb gedeclareerd in een functie zonder malloc
erin? Of, als ik het als een pointer heb aangegeven? Wat als ik het heb geïnitialiseerd met malloc
? Ik wil graag een uitgebreid antwoord.
Antwoord 1, autoriteit 100%
Je kunt strlengebruiken. De grootte wordt bepaald door het afsluitende null-teken, dus de doorgegeven tekenreeks moet geldig zijn.
Als je de grootte van de geheugenbuffer wilt, die je string bevat, en je hebt er een aanwijzer naar:
- Als het een dynamische array is (gemaakt met malloc), is het onmogelijk om te krijgen
de grootte, omdat de compiler niet weet naar welke aanwijzer verwijst.
(controleer dit) - Als het een statische array is, kun je
sizeof
gebruiken om de grootte te krijgen.
Als je niet zeker weet wat het verschil is tussen dynamische en statische arrays, controleer dan dit.
Antwoord 2, autoriteit 27%
Gebruik strlen
om de lengte van een null- beëindigde tekenreeks.
sizeof
retourneert de lengte van de array, niet de tekenreeks. Als het een pointer is (char *s
), en geen array (char s[]
), zal het niet werken, omdat het de grootte van de pointer teruggeeft ( gewoonlijk 4 bytes op 32-bits systemen). Ik denk dat een array wordt doorgegeven of geretourneerd als een aanwijzer, dus je verliest de mogelijkheid om sizeof
te gebruiken om de grootte van de array te controleren.
Dus, alleen als de string de volledige array (bijv. char s[] = "stuff"
) uitspant, met behulp van sizeof
VOOR A Statisch gedefinieerd array Retourneer wat u wilt (en wees sneller omdat het niet nodig heeft om de null-terminator te vinden) (als het laatste teken een null-terminator is, moet u een null-terminator zijn aftrekken 1). Als het de volledige array niet overspaart, zal het niet terugkeren wat u wilt.
Een alternatief voor dit alles is eigenlijk de grootte van de string opslaan.
Antwoord 3, Autoriteit 23%
Hoewel sizeof
werkt voor dit specifieke type string:
char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
Het werkt niet als str
aanwijzer (sizeof
IS RETOURNERS GROOTTE VAN DE POSER, MACHTER 4 OF 8) OF ARRACT MET GESPECTEERDE LENGTE (sizeof
retourneert de opgegeven lengte van de byte-aantal, die voor Char-type hetzelfde is).
Gebruik gewoon strlen()
.
Antwoord 4, Autoriteit 8%
Als u sizeof()
gebruikt, dan een char *str
en char str[]
retourneert verschillende antwoorden. char str[]
retourneert de lengte van de tekenreeks (inclusief de string-terminator) terwijl char *str
de maat van de aanwijzer terugstuurt (verschilt volgens de compiler).
Antwoord 5, Autoriteit 2%
Ik hou van gebruik:
(strlen(string) + 1 ) * sizeof(char)
Hiermee geeft u de buffergrootte in bytes. U kunt dit gebruiken met SNPRINTF () kan helpen:
const char* message = "%s, World!";
char* string = (char*)malloc((strlen(message)+1))*sizeof(char));
snprintf(string, (strlen(message)+1))*sizeof(char), message, "Hello");
Proost! Functie: size_t strlen (const char *s)