2009-11-25 9 views
53

Quel est le moyen le plus fiable de vérifier si un tableau de caractères est vide?La meilleure façon 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) {} 

Quelle est la façon la plus efficace d'aller à ce sujet?

+1

Donc vous vous demandez si vous avez besoin de tester null ou si vous avez besoin de mettre la chaîne à tous les 0, puis tester pour 0? –

+0

Oui, je ne savais pas si je pouvais tester une chaîne à NULL si je l'avais simplement déclaré et n'avais rien fait en premier. – ZPS

Répondre

56

Donné ce code:

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

Suivi par 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[] seront uninitialized et non définie. Ainsi, strlen(text) renverra un résultat indéfini.

Le/la plus rapide façon la plus simple d'assurer qu'une chaîne C est initialisé à la chaîne vide est simplement régler le premier octet à 0.

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

A partir de là, à la fois strlen(text) et très rapide, mais Les tests (text[0] == 0) non-simples vont détecter la chaîne vide.

+1

J'ai mal structuré, je voulais dire pour le memset (text, 0, sizeof (text)); venir immédiatement après le texte du caractère [50]; parce que je n'étais pas sûr que ce soit une mauvaise pratique de strlen un tableau de char avant qu'on lui ait assigné quoi que ce soit. – ZPS

+1

C'est certainement une mauvaise idée de strlen un tableau avant qu'il ne soit assigné - strlen avancera dans la mémoire jusqu'à ce qu'il atteigne un octet 0, qui peut être bien au-delà de la fin du tableau. –

18

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

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

devrait suffire.

Edit: Une autre méthode serait ...

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

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

4

La deuxième méthode serait presque certainement le moyen le plus rapide de tester si une chaîne à zéro terminal est vide, car elle implique une lecture et une comparaison. Il n'y a certainement rien de mal à cette approche dans ce cas, alors vous pouvez 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.

7

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) {} 
+1

N'utilisez pas strlen pour tester si un cstring est vide. Ce n'est pas une opération à temps constant. –

+0

C'est ce que j'explique dans la réponse. –

4

La seconde est la plus rapide. En utilisant strlen sera fermé si la chaîne est en effet vide, mais strlen ira toujours à travers chaque caractère de la chaîne, donc si c'est pas vide, il fera beaucoup plus de travail que vous en avez besoin. Comme l'a mentionné James, la troisième option efface la chaîne avant de la vérifier, de sorte que la vérification réussira toujours, mais elle n'aura aucun sens.

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

utiliser cette si votre codage pour les microcontrôleurs avec peu d'espace sur le flash et RAM, vous perdrez le flash beaucoup plus en utilisant strlen que de vérifier le premier octet. ci-dessus est le plus rapide était aussi avec moins de calcul.

Questions connexes