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?
É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.
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.
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) {}
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.
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.
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.