À l'aide de pointeurs, je peux accéder au caractère réel («i» dans ElGenerico) que je veux imprimer. Mais un caractère étrange est imprimé à l'écran, plutôt que mon caractère souhaité.
#include<stdio.h> int main() { char *name[]={"Sami","Kevin","ElGenerico"}; printf("%c",(*(name+2)+7)); return 0; }
Avec mon utilisation du spécificateur de sortie % s
, la sortie de ce code est "ico".
Mais je veux imprimer uniquement le caractère «i». J'ai donc essayé d'utiliser % c
, au lieu de % s
. Ça ne marche pas. Au lieu de cela, une double flèche est imprimée.
Quelqu'un peut-il me dire où je vais mal?
3 Réponses :
Vous pointez vers la mauvaise adresse. Utilisez plutôt ceci:
*(name[2] + 7)
Puisque vous faites référence au troisième élément du tableau name
, vous pouvez utiliser
name[2] + 7
Ensuite, vous vouliez mettre le 7ème élément du mot ElGenerico
, donc nous devons ajouter 7 à l'adresse:
name[2]
Après nous obtenir l'adresse correcte, puis nous imprimons la valeur de cette adresse, et nous utilisons le signe *
:
printf("%c",(*(name[2]+7)));
printf("%c",*(*(name+2)+7)); I used this, and it's solved, thanks for the help @David and @rcs...
C'est pourquoi nous n'écrivons pas un tel code trash mais plutôt name [2] [7]
, qui est équivalent à 100%.
Je recommande d'utiliser la notation entre crochets pour une meilleure lisibilité.
Au départ, vous aviez ceci:
#include <stdio.h> int main() { char* name[] = {"Sami", "Kevin", "ElGenerico"}; printf("%c", name[2][7]); return 0; }
Vous auriez encore besoin de déréférencer avec * pour obtenir le résultat souhaité. Cela vous donnerait ceci:
printf("%c", name[2][7]);
Cependant, cela reste un peu déroutant et pas très lisible. Vous pouvez le rendre beaucoup plus propre en utilisant la notation entre crochets, comme ceci:
printf("%c",*(*(name+2)+7));
Maintenant, il y a beaucoup moins de place pour l'erreur et vous obtenez toujours le résultat attendu.
Votre code final ressemblerait à ceci:
printf("%c",(*(name+2)+7));
printf ("% c", * (* (nom + 2) +7))
(il vous manque le premier'*'
) Mieux vaut utiliser le nom[2] [7]
Merci Monsieur, j'ai compris maintenant
Monsieur, pourquoi diriez-vous que le nom [2] [7] est le meilleur choix?
Elle est plus lisible que la notation par pointeur.
* (* (nom + 2) + 7)
est beaucoup plus compliqué quenom [2] [7]
, bien que les deux soient entièrement équivalents.Ce n'est pas parce que la langue nous permet d'utiliser quelque chose que nous devrions le faire.
nom [2] [7]
= lisible.* (* (nom + 2) + 7)
= illisible.7 [2 [name]]
= illisible.nom ?? (2 ??) ?? (7 ??)
= illisible.7<:2<:name:>:>
= illisible. Il existe d'innombrables façons d'écrire des C. extrêmement moche mais valide. Cela ne veut pas dire que nous devrions utiliser ces méthodes.@Lundin et user3121023 SIr, où pouvons-nous apprendre des syntaxes comme celles-ci? Je ne les ai jamais rencontrés et j'adore ça!