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 lors de l'affectation d'un caractère a une chaine


Sujet :

C

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 167
    Points : 88
    Points
    88
    Par défaut Problème lors de l'affectation d'un caractère a une chaine
    Bonsoir, je vous en pris je besoin une réponse a mon problème en urgence.
    Voici mon programme qui veut pas s'exécuter.
    j'ai un problème lors d'affection de 0 a ch[i]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int i=0;char*ch;char indice='0';
    main()
    {
     
    printf(" donnez indice\n");
    scanf("%c",indice);
    if (indice=='0') { ch[i]='0';i++;printf(" entre 1 \n"); }
      else  {ch[i]='1';i++;printf(" entre 2 \n");}
    i=0;
    while(ch[i]!='\0')
    printf("%c",ch[i]);
    }

    Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Bonsoir,

    ch semble représenter un tableau de char (tu y accèdes avec []).
    Il faudrait que tu alloues la mémoire associée.
    Si il fait une taille 1 déclare le ainsi :

    ainsi accéder à ch[0] aura un sens.
    Agamitsudo.

  3. #3
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 167
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par agamitsudo Voir le message
    Bonsoir,

    ch semble représenter un tableau de char (tu y accèdes avec []).
    Il faudrait que tu alloues la mémoire associée.
    Si il fait une taille 1 déclare le ainsi :

    ainsi accéder à ch[0] aura un sens.
    Agamitsudo.
    Merci pour votre réponse Agamitsudo.
    Mais normalement, le fait de déclarer "char*ch" sa veut dire qu'on a alloué l'espace a ch et normalement la différence entre char*ch et char ch[30] c'est que la première est déclare dynamiquement et la 2eme statiquement ??
    PS: j'ai toujours le meme problème

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Si tu as seulement char* c ..., rien n'est alloué. Tu déclares juste un pointeur.

    Dans ton cas et en C, tu as 2 possiblités :


    • Soit tu utilises malloc pour allouer ta mémoire (qu'il faudra explicitement désallouée après utilisation - avec free, je crois).
    • Soit tu utilises char c[20]; par eexemple. Qui sera désalloué à la fin du scope {}.

    A.

  5. #5
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 167
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par agamitsudo Voir le message
    Si tu as seulement char* c ..., rien n'est alloué. Tu déclares juste un pointeur.

    Dans ton cas et en C, tu as 2 possibilités :


    • Soit tu utilises malloc pour allouer ta mémoire (qu'il faudra explicitement désallouée après utilisation - avec free, je crois).
    • Soit tu utilises char c[20]; par eexemple. Qui sera désalloué à la fin du scope {}.

    A.
    j'ai modifié mon programme pour qu'il soit comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int i=0;char ch[30];char indice='0';
    main()
    {
     
    printf(" donnez indice\n");
    scanf("%c",indice);
    if (indice=='0') { ch[i]='0';i++;printf(" entre 1 \n"); }
      else  {ch[i]='1';i++;printf(" entre 2 \n");}
    i=0;
    while(ch[i]!='\0')
    printf("%c",ch[i]);
    }
    Mais j'ai toujours un problème lors de l'exécution du programme

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    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
    21
    22
     
    int i=0;char ch[30];char indice='0';
    main()
    {
      printf(" donnez indice\n");
      scanf("%c",indice);
      if (indice=='0')
      {
        ch[i]='0';// i vaux 0 <==> équivalent à ch[0]='0'
        i++;
        printf(" entre 1 \n"); 
      }
      else
      {
        ch[i]='1';// i vaux toujours 0 <==> équivalent à ch[0]='0'
        i++;
        printf(" entre 2 \n");
      }
      i=0;
      while(ch[i]!='\0')
        printf("%c",ch[i]);
    }
    Voilà à quoi ressemble ton code, pour moi, c'est une boucle infini au niveau de ton while(); Ton programme est FAUX!!

    Ton "i" vaux 0, ton ch[i] au meilleur des cas vaudra ou '0' ou '1' (si par chance tu tape '0' ou '1' au clavier) si non ça vaudra quelques choses (et je pèse mes mots).

    Dans ton code, on t'as certainement dit que tu devait utilisé un if else et un while, mais tu n'as pas su quoi en faire.

    Dit nous ce que tu veux faire, on essayera de te guider du mieux qu'on peut.

  7. #7
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 167
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par zehle Voir le message
    Dans ton code, on t'as certainement dit que tu devait utilisé un if else et un while, mais tu n'as pas su quoi en faire.

    Dit nous ce que tu veux faire, on essayera de te guider du mieux qu'on peut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void prefixe(arbre*a, char indice)
    {int i=0;
       if (!vide(a))
       {  if (indice=='0') { a->code='0'; ch[i]='0';i++; }
            else  {a->code='1';ch[i]='0';i++;}
          printf(" ****** Element de l'arbre ******  :  %d  ******  Champ code  ******  :   %c   \n", a->info, a->code);
          if(!feuille(a))
            {
              prefixe(filsgauche(a),'0');
              prefixe(filsdroit(a),'1');
            }
         else{strcpy(a->codoccur,ch);printf("Voici le code Voici le code  %s",a->codoccur);}
       }
    }
    Voila mon programme qui veut pas s'exécuter.
    je veux coder les feuilles d'un arbre on utilisant le codage de Huffman

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2004
    Messages
    304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 304
    Points : 405
    Points
    405
    Par défaut
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    void prefixe(arbre*a, char indice)
    {
      int i=0;//FAUX : pas au bon endroit, tu aura toujours ton ch[i] équivalent à ch[0]
      if (!vide(a))
      {
        if (indice=='0')
        {
          a->code='0';
          ch[i]='0';
          i++;
        }
        else
        {
           a->code='1';
           ch[i]='0';
           i++;
        }
        /* ton if else est équivalent à 
        a->code=indice;
        ch[i]='0';
        i++;
       //ça m'étonnerai que tu veuille faire ça ;)
       */
        printf(" * Element de l'arbre * : %d  * Champ code * : %c\n", a->info, a->code);
        if(!feuille(a))
        {
          prefixe(filsgauche(a),'0');
          prefixe(filsdroit(a),'1');
        }
        else
        {
           strcpy(a->codoccur,ch);
           printf("Voici le code Voici le code  %s",a->codoccur);
        }
      }
    }
    Regarde mon code et le tiens, et dit moi franchement lequel est le plus lisible, le plus compréhensible, le plus facile a interprété, à corriger, etc ..., bref.

    - Tu devrai déplacer ta variable "i" en variable globale (et non pas locale).
    - Ton "if(indice) else" est obsolète.
    - Sinon pour le reste, je pense que c'est bon

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/04/2009, 17h56
  2. Réponses: 1
    Dernier message: 31/03/2009, 18h57
  3. Réponses: 1
    Dernier message: 17/04/2007, 22h07
  4. Réponses: 12
    Dernier message: 04/09/2006, 17h59
  5. Réponses: 2
    Dernier message: 17/08/2003, 20h07

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