web-dev-qa-db-fra.com

Comment obtenir la taille de la chaîne en octets?

Comme le titre l'indique, ma question est de savoir comment obtenir la taille d'une chaîne dans C. Est-il bon d'utiliser sizeof si je l'ai déclarée (la chaîne) dans une fonction sans malloc? Ou, si je l'ai déclaré comme un pointeur? Et si je l'initialisais avec malloc? J'aimerais avoir une réponse exhaustive.

24
artaxerxe

Vous pouvez utiliser strlen . La taille étant déterminée par le caractère nul final, la chaîne transmise doit être valide.

Si vous voulez obtenir la taille de la mémoire tampon, celle-ci contient votre chaîne et vous avez un pointeur sur celle-ci:

  • S'il s'agit d'un tableau dynamique (créé avec malloc), il est impossible d'obtenir sa taille, car le compilateur ne sait pas à quel point pointe le pointeur. ( cochez cette case )
  • S'il s'agit d'un tableau statique, vous pouvez utiliser sizeof pour obtenir sa taille.

Si vous ne comprenez pas la différence entre les tableaux dynamiques et statiques, vérifiez this .

42
nmikhailov

Utilisez strlen pour obtenir la longueur d'une chaîne terminée par un caractère null .

sizeof renvoie la longueur du tableau et non de la chaîne. Si c'est un pointeur (char *s), pas un tableau (char s[]), cela ne fonctionnera pas, car il renverra la taille du pointeur (généralement 4 octets sur les systèmes 32 bits). Je crois qu'un tableau sera passé ou retourné sous forme de pointeur, vous perdriez ainsi la possibilité d'utiliser sizeof pour vérifier la taille du tableau.

Ainsi, uniquement si la chaîne s'étend sur tout le tableau (par exemple, char s[] = "stuff"), utiliser sizeof pour un tableau défini de manière statique renvoie ce que vous voulez (et sera plus rapide car il ne serait pas nécessaire boucle pour trouver le terminateur nul) (si le dernier caractère est un terminateur nul, vous devrez soustraire 1). Si cela ne couvre pas tout le tableau, il ne retournera pas ce que vous voulez.

Une alternative à tout cela consiste à stocker la taille de la chaîne.

13
Dukeling

Bien que sizeof fonctionne pour ce type de chaîne spécifique:

char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'

Cela ne fonctionne pas si str est un pointeur (sizeof renvoie la taille du pointeur, généralement 4 ou 8) ou un tableau de longueur spécifiée (sizeof renvoie le nombre d'octets correspondant à la longueur spécifiée. , qui pour le type de caractère sont identiques).

Il suffit d'utiliser strlen().

10
hyde

Si vous utilisez sizeof(), alors un char *str et char str[] retournera des réponses différentes. char str[] retournera la longueur de la chaîne (y compris le terminateur) tandis que char *str retournera la taille du pointeur (diffère selon le compilateur).

3
Aniket Bhanja

J'aime utiliser:

(strlen(string) + 1 ) * sizeof(char)

Cela vous donnera la taille de la mémoire tampon en octets. Vous pouvez utiliser ceci avec snprintf () peut aider:

const char* message = "%s, World!";
char* string = (char*)malloc((strlen(message)+1))*sizeof(char));
snprintf(string, (strlen(message)+1))*sizeof(char), message, "Hello");

À votre santé! Fonction: size_t strlen (const char *s)

2
A.Clymer