Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Messages recommandés

Posté(e)

Oui !

 

Enfin, bon, là j'espère que c'est rentré.

Je suis en train de m'entraîner, et je ne fais plus d'erreurs.

 

 

Sauf :

 

J'ai ce bout de code :

 

char* str = "TEST";

for (int i=0; i < 5; i++)

{

cout << str;

}

 

Jusque là, c'est bon.

 

Mais si je remplace par

 

char* str = "TEST";

for (int i=0; i < 5; i++)

{

cout << *str++;

}

 

Là, ça m'efface mon tableau de char...

Pourquoi ?

Posté(e)

heuu t'essaye vraiment tout et n'importe quoi toi :P

 

Je ne vois pas bien ce que tu veux faire avec ton bout de code qui ne fonctionne pas.

 

Cette ligne me laisse perplexe :

cout << *str++;

 

Au mieux ca doit pouvoir afficher la 1er caractere de ta chaine 5 fois et incrementer sa valeur ASCII.

 

Si tu veux afficher ta chaine caractère par caractère, ce serait plutot :

cout << str;

 

Automne

Posté(e)

Ne crois pas que c'est n'importe quoi ! Ça marche ce truc, mais ça ne marche qu'une seule fois !

Une fois que tout les caractères ont été affichés, il ne reste plus rien dans *str !

 

Regarde ce code :

#include "stdafx.h"

#include <iostream.h>



void fonc(char* param);

void fonc2(int* integ);



int main(int argc, char* argv[])

{

char ga;

char* str = "TEST";

cout << "Au d‚but, str = ";

for (int i=0; i<4; i++)

{

 cout << str[i];

}

fonc(str);

int ch = 5;

cout << " et ch = " << ch;

fonc2(&ch);

cout << "nEt … la fin, str = ";

for (int j=0; j<4; j++)

{

 cout << *str++;

}

cout << " et ch = " << ch << "n";

while (cin >> ga)

{

 cout << "A bient“t !";

 return 0;

}

}



void fonc(char* param)

{

param[0] = 'P';

}



void fonc2(int* integ)

{

*integ = 10;

}

 

*str est affiché à l'écran, la première fois : "TEST", avec l'opérateur d'indexation str;

 

Et la deuxième fois, il est affiché : "PEST" (on a modifié la variable dans fonc)

L'opérateur de déférenciation lit la valeur du pointeur, et l'envoie à cout.

Puis l'opérateur d'incrémentation '++', incrémente de 1 le pointeur, qui pointe maintenant vers le 2ème élément du tableau.

 

Mais si je l'utilise 2 fois sur le même tableau, la deuxième fois, le programme affiche "P " au lieu de "PEST"

 

 

 

Bon, je sais ce n'est pas très utile comme truc, mais je voulais juste comprendre ;-)

Posté(e)

Tu n'as pas compris ce que j'ai dit, relis mon message !

Le code que je donne plus haut marche parfaitement bien !

Seulement, si je remplace la première boucle (la suivante :)

  for (int i=0; i<4; i++) 

 { 

   cout << str[i]; 

 }

 

Par :

 

  for (int i=0; i<4; i++) 

 { 

   cout << *str++; 

 } 

 

Hé bien la deuxième boucle for (celle qui utilise la variable j pour les itérations, et qui utilise *str++) ne m'affiche qu'un 'P' avec 3 espaces. (note bien qu'il y a 3 espaces !)

 

Donc en résumé, si j'utilise *str++ dans 2 boucles, ça foire.

Si j'utilise *str++ dans une seule boucle (la deuxième, celle avec j comme variable et pas celle avec i, sinon ça foire aussi !!!), ça marche très bien !!!

 

Le mystère est là : il est tout à fait possible d'afficher "TEST" avec *str++ lors de la 1ère boucle.

Ensuite on met 'P' à la place de 'T'. Mais voilà, lors du 2ème affichage, les 3 derniers caractères ne sont plus là ! (que l'on utilise str[j] ou *str++)

J'en déduis que *str++ efface le contenu du tableau après sa lecture, et je me demande bien pourquoi. Là est ma question.

Posté(e)

Petit problème de compilo, je pense...

Il doit avoir du mal à interpréter *str++

D'après toi, il comprend *(str++) ou bien (*str)++ ?

Fais gaffe à ne jamais laisser le compilo décider l'interprétation de ta syntaxe, et ne laisse jamais de code équivoque dans tes sources...

Posté(e)

Du moment que '++' est prioritaire sur '*', je ne vois pas pourquoi cela poserait un problème, mais bon j'ai essayé. Résultat :

 

On pouvait s'y attendre : avec (*str)++, "TEST" devient "TUVW".

Et avec *(str++), "TEST" est affiché correctement la première fois, puis, même problème, il me sort un 'P' avec 3 espaces.

Que deviennent le 'E', le 'S' et le 'T' ???

 

Bon, si personne ne comprend pourquoi, je vais arrêter de poser ce genre de questions !

 

Merci quand même !

Posté(e)
Du moment que '++' est prioritaire sur '*', je ne vois pas pourquoi cela poserait un problème, mais bon j'ai essayé. Résultat :

 

Erreur !

'++' et '*' sont de meme niveau de priorité ! D'où les problèmes d'interprétation.

Ne confond pas '*' opérateur d'indirection avec '*' opérateur de multiplication. Ils utilisent le meme symbole mais sont bien 2 opérateurs différents avec des priorités différentes.

 

Pour ton probleme je vais voir ce que je peux faire dés que j'aurai reinstallé mon compilo C++. J'ai tout viré quand j'ai reinstallé la machine et j'ai po le courage de me retaper l'install de VS pour l'instant :P

 

Automne

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...