web-dev-qa-db-fra.com

Meilleur moyen de vérifier si un tableau de caractères est vide

Quel est le moyen le plus fiable de vérifier si un tableau de caractères est vide?

char text[50];

if(strlen(text) == 0) {}

ou

if(text[0] == '\0') {}

ou dois-je faire

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

Quel est le moyen le plus efficace d'y parvenir?

59
ZPS

Étant donné ce code:

char text[50];
if(strlen(text) == 0) {}

Suivi d'une question sur ce code:

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

Je sens la confusion. Plus précisément, dans ce cas:

char text[50];
if(strlen(text) == 0) {}

... le contenu de text[] sera non initialisé et non défini. Ainsi, strlen(text) renverra un résultat non défini.

Le moyen le plus simple et le plus rapide de s'assurer qu'une chaîne C est initialisée à la chaîne vide consiste simplement à définir le premier octet sur 0.

char text[50];
text[0] = 0;

À partir de là, les tests strlen(text) et les tests très rapides (text[0] == 0) Détecteront tous deux la chaîne vide.

71
bbum

Cela dépend si votre tableau contient ou non une chaîne terminée par un caractère null. Si oui, alors

if(text[0] == '\0') {}

devrait être suffisant.

Edit: Une autre méthode serait ...

if (strcmp(text, "") == 0)

ce qui est potentiellement moins efficace mais exprime clairement votre intention.

19
Parappa

Cela fonctionnera pour trouver si un tableau de caractères est vide. C'est probablement aussi le plus rapide.

if(text[0] == '\0') {}

Cela sera également rapide si le tableau text est vide. S'il contient des caractères, il doit d'abord compter tous les caractères.

if(strlen(text) == 0) {}
7
Peter Stuifzand

La deuxième méthode serait presque certainement le moyen le plus rapide de vérifier si une chaîne terminée par un zéro est vide, car elle implique une lecture et une comparaison. Il n’ya certainement rien de mal à cette approche dans ce cas, vous pouvez donc aussi bien l’utiliser.

La troisième méthode ne vérifie pas si un tableau de caractères est vide; il s'assure qu'un tableau de caractères est vide.

4
James McNellis

Le second est le plus rapide. Utiliser strlen sera proche if la chaîne est bien vide, mais strlen itérera toujours à travers tous les caractères de la chaîne, donc si elle est pas vide, cela fera beaucoup plus de travail que nécessaire.

Comme James l'a mentionné, la troisième option efface la chaîne avant de vérifier, de sorte que la vérification aboutira toujours, mais n'aura aucun sens.

4
Graeme Perrow
if (text[0] == '\0')
{
    /* Code... */
}

Utilisez-le si vous codez pour des micro-contrôleurs disposant de peu d'espace sur le flash et/ou la RAM. Vous allez gaspiller beaucoup plus de flash avec strlen que de vérifier le premier octet.

L'exemple ci-dessus est le plus rapide et nécessite moins de calculs.

2
Tony