Comparaison entre pointeur et entier en C

J’ai une question un peu stupide sur le programme en C. Mon compilateur me dit: avertissement: comparaison entre pointeur et entier . Je ne sais vraiment pas pourquoi. Je veux seulement écrire chaque caractère sur l’écran.

Mon code:

int i = 0; char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test while (str[i] != NULL) { putchar(str[i]); i++; } 

Pouvez-vous m’aider s’il vous plaît? Je n’ai trouvé aucune réponse utile sur Internet.

NULL est un pointeur et str[i] est le i-ème caractère du tableau str. char est de type entier, et lorsque vous les comparez, vous obtenez l’avertissement.

Je suppose que vous voulez vérifier la fin de la chaîne, que vous feriez avec une vérification du caractère avec la valeur 0 (fin de la chaîne), qui est '\0' .

MAIS: cela ne vous aidera pas car vous le définissez comme un tableau de caractères et non comme une chaîne, et vous n’avez pas défini le 0 final dans le tableau de caractères (vous avez simplement de la chance qu’il soit implicite).

PS: La prochaine fois, vous devriez au moins donner les informations pour lesquelles le compilateur se plaint.

NULL ne devrait être utilisé que dans des contextes de pointeur, mais ici, vous le comparez à un personnage.

Vous voudriez normalement quelque chose comme:

 while (str[i] != '\0') { 

[ou, bien sûr, quelque chose comme puts(str); ou printf("%s", str); ]

Vous devez comparer la valeur de str [i] avec le ‘\ 0’ final d’une chaîne, plutôt que NULL, qui est considéré comme un pointeur. Votre

while (str[i] != NULL ) {

changé en

while (str[i] != '\0') {

au dessous de:

 int i = 0; char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test while (str[i] != '\0') { putchar(str[i]); i++; } 

str[i] est un personnage. NULL est un pointeur. Vous ne pouvez pas comparer de manière significative ces deux types de données (bien qu’ils puissent ou non être implémentés avec la même taille d’un entier en interne). C’est tout ce que le message d’erreur signifie.

Non pas que la comparaison ne soit pas seulement du type incorrect, elle ne fait pas non plus ce que vous voulez dire. Vous semblez supposer qu’un tableau de caractères avec un initialiseur incomplet se termine automatiquement par un caractère \ 0, mais cette règle s’applique aux littéraux de chaîne, pas aux tableaux de caractères que vous créez vous-même. En tant que tel, vous invoquez un comportement non défini.

Le plus gros problème avec ce code est que, selon votre implémentation, il pourrait être compilé sans erreur.

Le problème, comme d’autres l’ont dit, est que NULL est censé représenter une valeur de pointeur null, pas une valeur de caractère nulle. Utilisez '\0' pour désigner un caractère nul. (Ou vous pouvez utiliser 0 , ce qui est équivalent, mais '\0' exprime plus clairement l’intention.)

NULL est une macro qui se développe en une constante de pointeur null définie par l’implémentation. Une constante de pointeur null peut être une expression de constante entière avec la valeur 0 ou une telle expression convertie en void* . Ce qui signifie que NULL peut être défini comme 0 ou comme ((void*)0) (entre autres variations).

Apparemment, votre implémentation le définit comme quelque chose comme ((void*)0) , c’est pourquoi vous avez reçu le message d’avertissement. (Il aurait pu, et IMHO aurait dû être traité comme une erreur fatale).

N’essayez donc jamais d’utiliser NULL autrement qu’en tant que constante de pointeur null – et ne comptez pas sur le compilateur pour vous avertir en cas de mauvaise utilisation.

NULL est défini comme un type de pointeur, généralement (void*)0 . Cela signifie qu’il ne devrait pas être comparé à des caractères (qui sont promus en entiers lorsqu’ils sont utilisés seuls). Le problème est le suivant: str[i] != NULL . La bonne façon de faire est de le comparer à quelque chose du même type. Dans ce cas, vous recherchez le caractère nul, '\0' .

Ici str [i] est un caractère, NULL est un pointeur, nous ne pouvons donc pas le comparer logiquement. Utilisez ‘\ 0’ pour comparer avec str [i] car il est défini comme un caractère nul. Ainsi, comparer un caractère str [i] avec un caractère nul ‘\ 0’ est une bonne méthode et ne comporte aucun avertissement.

s’il vous plaît écrivez votre code comme ça

 int i = 0; char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test while (str[i] != "\0") { putchar(str[i]); i++; }