52 votes

Quelle est la différence entre str == NULL et str [0] == '\ 0' en C?

Je veux connaître la différence entre str == NULL et str[0] == '\0' :

 int convert_to_float(char *str, double *num)
{
    if ((str == NULL) || (str[0] == '\0'))
        return(-1);

    *num = strtod(str, (char **)NULL);
    return(0);
}
 

J'utilise gcc sous Linux.

109voto

Mysticial Points 180300

str==NULL vous indique si le pointeur est NULL.

str[0]=='\0' vous indique si la chaîne est de longueur nulle.

Dans ce code, le test:

if ((str == NULL) || (str[0] == '\0'))

est utilisé pour attraper les cas où il est soit NULL ou est de longueur nulle.


Notez que de court-circuit joue ici un rôle essentiel: Le point du test est de s'assurer que l' str est valable un c-string avec une longueur au moins égale à 1.

  • Le deuxième test, str[0] == '\0' ne fonctionnera que si str n'est pas NULLE.
  • Par conséquent, le premier test str == NULL est nécessaire pour sortir plus tôt, lorsque str a la valeur NULL.

46voto

scraimer Points 7000

Il est important de se rappeler qu' str n'est pas vraiment une "chaîne", mais plutôt un pointeur à l'emplacement mémoire où un char (une partie d'une chaîne de caractères) est stockée.

Ensuite, nous devons comprendre comment le compilateur voit tous ces éléments. Regardons leurs types:

  • str est de type char * (littéralement, "pointeur vers un char")
  • NULL est un pointeur null constante (au moins sur mon système, c'est ((void*)0))
  • '\0' est un caractère constant (c'est en fait de type int, mais ne vous inquiétez pas; il est généralement utilisé dans un contexte qui nécessite une char de la valeur)

Voir l' * en char * et void *? Qui indique au compilateur que ce sont les types pointeur (ce qui est une façon élégante de dire que les variables de ce type ne détiennent pas la valeur, ils ont juste à point). Ainsi, lorsque le compilateur voit char *str, il sait ce que vous pourriez demander de faire quelque chose comme *str ou str[0] (dont les deux font la même chose). Nous y reviendrons plus tard.

Vous voyez, quand vous écrivez str dans un programme en C, le compilateur sait qu'une variable appelée "str" est stocké dans un emplacement de mémoire, par exemple 0x0001. Le code qu'il génère va à 0x0001 et extrait la valeur. De cette façon, si vous faites quelque chose comme

str + 1

Ensuite, le compilateur génère un code qui ressemble à quelque chose comme:

fetch the value from where str is stored (0x0001)
add 1 to that value

Qui est quelque chose que je suis sûr que vous savez. Alors maintenant, il devrait être évident que cette ligne dit:

str == NULL

Depuis NULL est un pointeur null constante, que les tests en ligne si str est un pointeur null (c'est à dire, un pointeur qui ne pointe pas vers quoi que ce soit).

Ainsi, le compilateur génère en général un code comme ceci:

fetch the value from where str is stored
check if that value is 0

Souvenez-vous maintenant, si vous s'il vous plaît, que nous avons dit au compilateur qu' str est vraiment un type pointeur. Nous sommes donc autorisés à écrire ceci:

*str

Et que fait le compilateur de générer ce:

fetch the value from where str is stored
now use that value as a memory address and fetch what is stored there

Donc, si str est tenue 0x0200, alors on obtient la valeur de l'adresse mémoire 0x0200. Notez que le compilateur n'a pas vraiment de soins si une chaîne est vraiment stockés ou non.

(Je vais supposer que vous savez qu' str[0] est le même que *str. Il le rend plus facile d'expliquer ce qu'il se passe.)

Comment à ce sujet, alors?

*str == '\0'

De sorte que la ligne est vraiment, en effet:

*str == (char) 0

Ce qui rend le compilateur de générer ce:

fetch the value from where str is stored
now use that value like a memory address and fetch the char that is stored there
check if the value of that fetched char is 0

Pour résumer:

  • La rédaction str == NULL vous indique si le pointeur str pointe à rien.
  • La rédaction *str == '\0' vous indique si le pointeur str pointe à une chaîne vide (en fait, pointant vers un emplacement de la mémoire la tenue d'un zéro).

(Une "chaîne" est, par définition, "une séquence contiguë de caractères terminée par et y compris le premier caractère nul", de sorte que si le premier caractère d'une chaîne est - '\0', alors que la chaîne est une chaîne vide.)

27voto

JaredPar Points 333733

Essentiellement

  • str == NULL détermine si str est un pointeur NULL
  • str[0] == '\0' détermine si str est une chaîne de style c de longueur 0

Lorsque vous les combinez, vous vérifiez si la valeur est NULL ou vide. Cela permet à la fonction d’éliminer les deux formes de données vides au début de la méthode.

8voto

triclosan Points 2814

str == NULL vérifiant str est un pointeur NULL (pointeur nulle part)

str[0] == '\0' (si ce n'est pas le pointeur NULL) vérifiant que le premier élément str a la valeur 0 (chaîne sans caractères, terminaison 0 uniquement)

7voto

Matt Joiner Points 29194

str==NULL vous indique si la chaîne est NULL .

*str=='\0' vous indique si la chaîne est de longueur nulle.

Remarque : Cette réponse est un jeu de la réponse de 15 secondes de Mystical qui avait str=='\0' . Bien sûr, les modifications apportées au cours des 3 ou 4 premières minutes ne sont pas affichées et il a corrigé le problème «ಠ_».

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X