IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème de pointeur


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut Problème de pointeur
    Salut à tous

    j'ai creé un code C pour calculer la position d'un caractere (c) dans une chaîne (ch) mais le problème que l'application s'exécute mais il paraît qu'il y a une boucle infinie avec message Windows "pos.exe a cessé de fonctionner" et au dessous de l'IDE il y a les erreurs suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     C:\test\SansNom1.c In function `pos': 
    10 C:\test\SansNom1.c [Warning] comparison between pointer and integer 
    11 C:\test\SansNom1.c [Warning] comparison between pointer and integer

    et voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int pos(char c[],char ch[])
    {
        int i=0,n=strlen(ch);
              do
              {
              i++;
              }while ((ch[i]!=c)||(i!=n));
              if (ch[i]!=c){i=0;} ;
              return i;
    }
    int main (int argc,char *argv[])
    {
        char c[1],ch[9999];
        scanf("%s %s",ch,c);
        printf("%d",pos(c,ch));
        getchar();
    }
    aidez-moi SVP

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pourquoi avoir déclaré c comme un tableau de un caractère, au lieu de simplement un caractère?
    (note: le code scanf() d'un caractère seul est %c)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Par défaut
    Alors en effet, petit problème avec char c[1]:
    - Soit tu mets char c[2] car il faut inclure le caractère de fin de chaîne et dans ce cas dans ta fonction du compare non pas avec c mais c[0];
    - soit tu utilises simplement char c = 'c';

    Sinon, ton code pose problème sur deux autres points:
    - tu ne testes pas le premier élément de la chaîne (et oui attention aux do ... while), après est-ce volontaire?
    - la condition de la boucle n'est pas bonne : que ce passe-il si tu as atteint la fin de la chaîne ? Que vaut alors : "(ch[i]!=c)||(i!=n)" ?
    et oui ça fait 0||1 = 1; donc tu continues... Aurais-tu fais une confusion entre || et && ?

    Bon courage à toi!

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pourquoi avoir déclaré c comme un tableau de un caractère, au lieu de simplement un caractère?
    (note: le code scanf() d'un caractère seul est %c)
    Merci mais "projet.exe a cessé de fonctionner"

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut
    Citation Envoyé par alyma Voir le message
    Alors en effet, petit problème avec char c[1]:
    - Soit tu mets char c[2] car il faut inclure le caractère de fin de chaîne et dans ce cas dans ta fonction du compare non pas avec c mais c[0];
    - soit tu utilises simplement char c = 'c';

    Sinon, ton code pose problème sur deux autres points:
    - tu ne testes pas le premier élément de la chaîne (et oui attention aux do ... while), après est-ce volontaire?
    - la condition de la boucle n'est pas bonne : que ce passe-il si tu as atteint la fin de la chaîne ? Que vaut alors : "(ch[i]!=c)||(i!=n)" ?
    et oui ça fait 0||1 = 1; donc tu continues... Aurais-tu fais une confusion entre || et && ?

    Bon courage à toi!

    le but de cette condition quand il trouve ch[i]=c la boucle s'arrete sinon s'il ne trouve pas la boucle s'arret aussi mais a la fin de cette foncion pos si "ch[i]!=c" la pos retour avec "0" sinon elle retour avec valeur "i" laposotion ce c dans ch
    en plus j'ai change c a c[2] mais meme erreur

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est pourtant pas compliqué avec un seul caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int pos(char c, char const ch[]) /*const parce que la fonction ne modifie pas la chaîne*/
    {
    	int i=0, n=strlen(ch);
    	do
    	{
    		i++;
    	} while ( (ch[i]!=c) && (i!=n) ); /*Corrigé || en &&*/
    	if (ch[i]!=c) {i=0;}
    	return i;
    }
    int main (int argc,char *argv[])
    {
        char c, ch[9999];
        scanf("%9999s %c", ch, &c); /*Attention, scanf("%c") nécessite passage par pointeur*/
        printf("%d", pos(c,ch));
        getchar();
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut
    merci le programme est fonctionel mais pourquoi il faut changer de || a && en effet si une seule condition est vraie (s'il trouve le caractere ou atteint la fin de la chaine) la boucle s'arret

    Citation Envoyé par Médinoc Voir le message
    C'est pourtant pas compliqué avec un seul caractère:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	} while ( (ch[i]!=c) && (i!=n) ); /*Corrigé || en &&*/

  8. #8
    Membre chevronné
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Par défaut
    Bonjour,

    L'opération logique && entre les deux tests est nécessaire pour que dès lors qu'une condition est atteinte, la boucle s'arrête. En effet, si tu rencontres ton caractère, tu sors de ta boucle, peu importe s'il reste des caractères dans ta chaine. La condition est vraie tant que mon caractère lu est différent du caractère recherché et tant qu'il reste des caractères à lire.

    En laissant ||, si tu rencontres ton caractère mais qu'il te reste des caractères dans la chaine, tu vas poursuivre ta boucle. La condition est vraie tant que le caractère lu est différent du caractère recherché OU s'il reste des caractères à lire.
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut
    Citation Envoyé par deletme Voir le message
    Bonjour,

    L'opération logique && entre les deux tests est nécessaire pour que dès lors qu'une condition est atteinte, la boucle s'arrête. En effet, si tu rencontres ton caractère, tu sors de ta boucle, peu importe s'il reste des caractères dans ta chaine. La condition est vraie tant que mon caractère lu est différent du caractère recherché et tant qu'il reste des caractères à lire.

    En laissant ||, si tu rencontres ton caractère mais qu'il te reste des caractères dans la chaine, tu vas poursuivre ta boucle. La condition est vraie tant que le caractère lu est différent du caractère recherché OU s'il reste des caractères à lire.
    je comprend que avec while && sera ou et || sera et.
    c'est juste??

  10. #10
    Membre chevronné
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Par défaut
    Il ne faut pas le comprendre comme ça.

    J'ai deux conditions testées à chaque tour de boucle de mon while :

    • est-ce que je veux quitter ma boucle dès que l'une des deux est fausse (je continue tant que la première ET la deuxièmes sont vraies) = &&

    • ou alors je veux quitter ma boucle uniquement lorsque les deux sont fausses (je continue ma boucle tant que l'une OU l'autre est vraie) = ||
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu veux "sortir de la boucle si on a trouvé le caractère ou si on arrive au bout".

    Mais le while() dit "rester dans la boucle si..." il faut donc inverser la condition en disant "on reste dans la boucle tant qu'on n'a ni trouvé le bon caractère ni arrivé au bout".

    Soit comme ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    	} while ( (ch[i]!=c) && (i!=n) ); /*Corrigé || en &&*/
    Soit comme cela:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    	} while ( !( (ch[i]==c) || (i==n) ) );
    Ces deux formulations sont équivalentes.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2012
    Messages : 6
    Par défaut
    merci pour vos reponces maintenant j'ai compris le traitement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo