-2
votes

Qu'est-ce qu'une * variable! = 0 signifie?

char *e; 
while(*e!=0)
{
  if(isalnum(*e))
    printf("%c",*e);

  e++;
} 
But *e is a pointer, right ? 
So address should be printed, right ?

2 commentaires

Ce code contient des erreurs de base de syntaxe. N'oubliez pas que c est sensible à la casse .


Référence obligatoire au Liste de livres . Essayer d'apprendre C, surtout si vous ne comprenez pas déjà les pointeurs, en regardant le code et que vous demandez beaucoup de questions, est susceptible d'être frustrant.


3 Réponses :


4
votes

mais * e est un pointeur droit?

non. E est un pointeur. * E est le premier Char IT pointe sur. Lorsqu'il est utilisé dans une expression (plutôt qu'une déclaration de type) comme un opérateur unaire (un opérateur avec un opérande), * est le Opérateur indirect .

Que fait une * variable! = 0 moyenne?

supposer que la boucle est réellement: xxx

... Cela signifie de garder une boucle pendant que le Char que E points sur est ! = 0 . Les chaînes C sont terminées avec un 0 char , '\ 0' (mais généralement écrit comme simplement 0 ).


Je dois noter que la boucle de la question, en plus des typos de base comme char au lieu de char et pendant au lieu de tandis que a la principale erreur logique qu'elle ne modifie jamais la valeur de E dans le corps de la boucle. Cela signifie que si elle boucle une fois, ça va boucler pour toujours; Il a besoin ++ e; quelque part. ( E n'est jamais initialisé.) Donc, par exemple, par exemple: xxx

ou, vraiment, c'est ce que pour est Pour: xxx


0 commentaires

0
votes

Il y a une ancienne règle C: la déclaration ressemble à utiliser . Donc, si char * e est une déclaration de stockage pour le pointeur à un char , * e est utilisé, ..e. Accès à l'objet pointé par e .

Le code fourni contient également UB car E n'est pas initialisé. Résultat de la variable d'inspection qui n'a pas été initialisé n'est pas défini. La déséroférance de ce pointeur serait indéfinie aussi bien parce que par définition que le pointeur ne pointe rien, et n'est pas un pointeur nul.


0 commentaires

1
votes

pour commencer il y a des typos xxx

vous voulez dire xxx

de plus que le pointeur E n'est pas initialisé . Il doit être initialisé par une chaîne. Par exemple xxx

et enfin le pointeur dans la boucle n'est pas modifié. Un extrait de code valide peut ressembler à xxx

dans l'état de la boucle tandis que le pointeur E est comparé à zéro qui est en fait avec le null caractère de terminaison. Il serait donc préférable d'écrire xxx

chaque chaîne en C est inclut et se termine avec le caractère de terminaison zéro. Donc, dans la condition, il y a un chèque si c'est la fin de la chaîne. Sinon, entrez dans le corps de la boucle.

Dans l'appel de la fonction Isalnum, vous devez lancer le caractère sur le type de type non signé comme fonction requis.

ici est un programme de démonstration. xxx

La sortie du programme est xxx

qui est les caractères vides ne sont pas émis car ils ne sont pas caractères alphanumériques.


3 commentaires

'\ 0' peut être sans doute plus correct, mais 0 est idiomatique.


@Tjcrowder, car les deux sont des valeurs identiques de type identique ( int ) dans c Il y a un argument selon lequel 0 est aussi correct que \ 0 mais , contrairement à vous, je ne pense pas que 0 est plus idiomatique. Je veux définitivement voir char constantes dans le code qui effectue des travaux sur des caractères.


@Konradrudolph - Je reporte votre expérience presque certainement plus grande. J'ai toujours écrit '\ 0' . (Long de temps depuis que j'ai écrit c régulièrement.) Mais je ne l'ai presque jamais vu dans le code des autres. :-)