Nombre déléments dans un tableau char

Quel type de fonction puis-je utiliser pour savoir combien déléments il y a dans un tableau char?

sizeof () donne le nombre d « espaces » disponibles donc ça ne marche pas pour moi.

Commentaires

  • Pouvez-vous donner un exemple sil vous plaît? par exemple. char foo [100] = "bar"; – est-ce ce que vous voulez dire? Vous voulez la réponse: 3?
  • oui que ' s droit

Réponse

Vous voulez strlen.

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

Commentaires

  • Si la réponse a fonctionné pour vous, veuillez cliquer sur le bouton " accepter " (il ressemble à une coche). De cette façon, les autres personnes sauront que le solution a fonctionné.
  • Jai dû attendre quelques minutes pour le faire
  • Notez que cela ne fonctionnera que si les données de votre contient une chaîne ascii et se termine correctement par un nul. De plus, si vous avez une longue chaîne dans le char[], et que vous la remplacez par une chaîne plus courte sans ajouter la terminaison nulle, vous obtiendrez la taille de lancienne chaîne.
  • Tout à fait raison. Ma réponse concernait la question telle que présentée. Les choses que vous mentionnez doivent être prises en compte pour les chaînes C terminées par un nul.

Réponse

Je vous connais ayez votre réponse de @NickGammon, mais jaimerais simplement ajouter des informations un peu plus détaillées sur la façon dont tout cela fonctionne.

sizeof() nest pas un fonction au sens normal du mot. Cest un opérateur qui vous donne le nombre doctets de mémoire alloués à tout ce que vous lui passez. Si vous lui passez un tableau, il renvoie le nombre doctets dont le tableau dispose. Si vous lui transmettez un pointeur vers un tableau, il renvoie la taille de ce pointeur, pas la taille du tableau. Si vous lui transmettez une variable entière, il renvoie le nombre doctets utilisés par cette variable entière (2 sur un 8 bits système comme AVR, 4 sur un système 32 bits comme le Due).

Donc quelques exemples:

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 

Maintenant strlen(). En quoi cela diffère-t-il exactement de sizeof()? En termes simples, compte le nombre de caractères dans un tableau de caractères jusquà ce quil atteigne le caractère \0 qui est le caractère de fin » NULL « dune chaîne C. Prenons les exemples précédents mais utilisons strlen à la place:

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. 

Vous remarquez quil renvoie toujours le nombre de caractères dans la chaîne jusquà, mais non compris, le caractère \0 de fin.

Dans sa forme la plus simple, la fonction strlen() pourrait ressembler à ceci:

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

Fondamentalement, il commence au premier caractère de la chaîne (*p = data), examine si cest « sa \0 ou non (while (*p)), incrémente le nombre de caractères (c++) et passe au caractère suivant dans la chaîne (p++).

Si vous souhaitez parcourir votre chaîne dans votre programme, vous pouvez appeler strlen() dabord pour obtenir le nombre de caractères dans la chaîne, puis utilisez cette valeur dans une boucle. Cest un peu inutile, puisque strlen() parcourt dabord la chaîne, donc vous finissez par la parcourir deux fois. Il est beaucoup plus efficace dapprendre comment parcourir au mieux chaque caractère de la chaîne jusquà ce que vous trouviez le caractère de fin, par exemple comment la fonction strlen() utilise le pointeur pour se déplacer dans la mémoire. Vous pouvez également voir à quel point il est vital de vous assurer que le caractère \0 existe à la fin de la chaîne, sinon comment fonctionnera comme strlen() savoir quand sarrêter? Ils ne peuvent pas savoir quelle est la longueur de la chaîne (sizeof() retournera la taille du pointeur qui lui est passé, pas la taille du tableau), ils doivent donc avoir une sorte de marqueur manuel, et la convention en C est dutiliser \0.

Notez que les fonctions print() dArduino faites-le de manière très inefficace. Si vous faites quelque chose comme:

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

Cela fera en fait pas mal de travail dont il na pas vraiment besoin. étape par étape:

  1. appelle println (message)
  2. qui appelle write (message)
  3. qui obtient la longueur de la chaîne avec strlen (message)
  4. et appelle write (message, length)
  5. qui boucle alors de 0 à length-1 en envoyant chaque caractère du message à write () tour à tour.
  6. affiche enfin le \r\n pour la nouvelle ligne.

Donc, il se termine en fait imbriqué autour de 4 fonctions profondes, et itère la chaîne entière deux fois. exemple classique de la façon de perdre du temps de traitement.En parcourant la chaîne une fois à la recherche du caractère \0 dans la fonction write(message) (étape 2), il fonctionnerait au moins deux fois plus vite. Bon vieil Arduino …

Commentaires

  • Re « Dans sa forme la plus simple, la fonction strlen () pourrait ressembler à ceci », dans un ( peut-être plus simple?), cela pourrait ressembler à: int strlen(const char *data) { const char *p = data; while (*p++); return p-data-1; }
  • @ jwpat7 Jai dit " le plus simple ", pas " le plus court et le plus compact ". Cette forme, bien que plus petite et plus efficace, est beaucoup plus difficile à comprendre pour lOP (qui nest évidemment pas un programmeur).
  • Daccord 🙂 Il est également plus facile de faire des erreurs dans . Et si le \0 est le dernier octet accessible dans un segment, le *p++ sera défaillant. Mais int strlen(const char *data) { const char *p = data; while (*p) ++p; return p-data; } évite ce problème.
  • En fait, *p++ a gagné ' t faute même si \0 est le dernier octet accessible dans un segment; la partie *p accédera au dernier octet; la partie ++ définira p sur une adresse invalide; mais comme cette adresse invalide nest pas ' référencée, sur une machine typique aucune erreur ne se produit.
  • Cest une macro de compilation … Ce ' nest pas une macro , il ' est un opérateur (comme " + " et " – " sont des opérateurs). Ils sont de niveau inférieur aux macros qui sont des choses faites au temps du pré-processeur. Voir opérateur sizeof . Opérateurs en C ++

Answer

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

Commentaires

  • Avez-vous correctement lu la question?
  • Le PO a dit sizeof " ne ' t fonctionne pour moi " et alors vous suggérez dutiliser sizeof.
  • ne peut pas répondre à la question lorsque vous utilisez la même inconnue

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *