Partage
  • Partager sur Facebook
  • Partager sur Twitter

probléme avec un strcpy!!

je cherche une solution (alternative)?

    22 octobre 2008 à 21:20:10

    Bonjour,
    je dispose dans un de mes programme en c de 2 variables de type char * et je souhaiterai copier l une des variable dans l'autre. La fonction strcpy ne marche pas (ce qui est logique puisque si je ne dis pas de bétise pour l'utiliser il faut une variable de type char* et une variable de type const char. Comment faire surmonter ce probléme?
    (je ne dispose que des blibliothéque standart)
    Merci de me répondre
    • Partager sur Facebook
    • Partager sur Twitter
      22 octobre 2008 à 21:21:56

      Bonjour,

      fait voir ton code, on verra ce qu'il ne va pas (et il est tout a fait possible de copier une chaine de caractère vers une autres sans qu'aucune des deux ne soit constante, c'est dans la fonction que la variable est considéré comme constante).
      • Partager sur Facebook
      • Partager sur Twitter
        22 octobre 2008 à 21:24:05

        Salut, :)
        http://en.wikipedia.org/wiki/Strcpy
        Il y a tout, maintenant tu pourras bien utiliser la fonction.
        • Partager sur Facebook
        • Partager sur Twitter
          22 octobre 2008 à 21:31:09

          #include <stdio.h>
          #include <stdlib.h>
          #include<string.h>
          #define TAILLE_MAX 100
          #define NB_EVENEMENT_MAX 30
          typedef struct BETA BETA;
          struct BETA
          {
              char *A;
          
          
          };
          
          BETA re(BETA tab_cal[NB_EVENEMENT_MAX]);
           
          int main(int argc, char *argv[])
          { 
              BETA tab_cal[NB_EVENEMENT_MAX];
              *tab_cal = re(tab_cal);
              system("pause");
              return 0;
          }
          
          
          BETA re(BETA tab_cal[NB_EVENEMENT_MAX])
          {
              FILE* fichier = NULL;
              int num_evenement=0, k = 1,nb=0; 
              char chaine[TAILLE_MAX] = "";//util pour recuperer le contenu du fichier ics
              //tableau de type calendrier strucutre defini dans le header file
              
              fichier = fopen("CALENDRIER.txt", "r");
              if (fichier != NULL)
              { 
                  while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
                  {
                        strcpy(tab_cal[nb].A, strchr(chaine, ':'));
                        printf("date deb %s\n", tab_cal[nb].A);
                  }
              fclose(fichier);
              }
              return *tab_cal;
          }
          

          Je sais que ce bout de code n'as aucun sens mais je ne comrpend aps pourquoi la copie rate.
          • Partager sur Facebook
          • Partager sur Twitter
            22 octobre 2008 à 21:39:39

            Citation : sonicc

            La fonction strcpy ne marche pas (ce qui est logique puisque si je ne dis pas de bétise pour l'utiliser il faut une variable de type char* et une variable de type const char.


            Je n'ai pourtant aucun problème avec ce code :
            #include <stdio.h>
            #include <string.h>
            
            int main (void)
            {
                char str[] = "Bonjour, Maitre.";
                char cpy[20] = "";
            
                strcpy (cpy, str);
                printf ("%s", cpy);
            
                getchar(); /* Histoire d'avoir le temps de lire */
            
                return 0;
            }
            


            Le type const char du deuxième argument de strcpy nous assure que simplement que cet argument ne sera pas modifié (ça tombe bien, il n'est pas question d'y toucher, juste de le copier). Dans mon exemple, str sera converti lors du passage à strcpy mais ça n'as pas d'incidence sur son utilisation dans main.

            Si tu as un problème avec cette fonction, poste du code.

            Citation : sonicc

            (je ne dispose que des blibliothéque standart)


            Ah bon ? Pourquoi cela ? Comment espérais-tu te servir de strcpy alors ?</span>

            Edit. : Pardon, je ne sais plus lire.
            • Partager sur Facebook
            • Partager sur Twitter
              22 octobre 2008 à 21:47:00

              je dispose de la blibliothéque string.h mais ce que je voulais dire pour les blibliothéque c'est que je ne dispose pas d'autres blibliothéque que la string.h ...je ne tiens pas a utiliser une blibliothéque farfelue pour des questions de portabilités du code.
              Merci pour la rapidité de vos réponses.
              Pour ce qui est de l'exemple c'est le meme que celui du site du zero que tu m'as posté cependant je comprend pas pourquoi mon code ne marche pas (il compile mais crash)
              • Partager sur Facebook
              • Partager sur Twitter
                22 octobre 2008 à 22:24:04

                Il y a une confusion entre les tableaux et les pointeurs.
                Comprends bien qu'ici :
                typedef struct BETA BETA;
                struct BETA
                {
                    char *A;
                };
                

                Tu déclares une structure qui ne contient rien d'autre qu'un pointeur sur un char, en aucun cas une chaîne de caractères ou un tableau capable d'en contenir une. Éventuellement, tu pourras effectivement le faire pointer sur une chaîne de caractères contenue en mémoire. Déclarer une telle structure est une complication franchement inutile (pour l'utilisation qui en est faite ici).

                Ici :
                BETA tab_cal[NB_EVENEMENT_MAX];
                

                Ce que tu déclares n'a toujours rien à voir avec une chaîne de caractères ou même avec un tableau de chaînes de caractères : c'est un tableau dont chaque case est de type BETA, c'est-à-dire, ici, qu'il contient des pointeurs sur des chars (en moins pratique à utiliser puisque qu'on devras utiliser la syntaxe propre aux structures).

                Tout ceci pour en venir à la ligne qui fait effectivement planter le tout :
                strcpy(tab_cal[nb].A, strchr(chaine, ':'));
                

                Primo : ce que strchr renvoi n'est pas une chaîne, c'est également un pointeur sur un élément de "chaine" qui ne contiens peut-être même pas d'indicateur de fin de ligne \0 (comment strcpy est-elle censée savoir quand s'arrêter de copier ?).
                Secondo : "tav_cal[nb].A" est un pointeur sur une zone quelconque à laquelle la fonction va tenter d'accéder sans en avoir le droit puisque tu ignores quel est cet espace (pointeur non initialisé) et que tu n'as rien alloué de tel (c'est un pointeur, une adresse, rien de plus).

                Je finirais sur ceci :
                *tab_cal = re(tab_cal);
                

                Qui nous fait toucher au pur délire. Commences par revoir le reste en profondeur.

                Une petite référence sympa au passage : les tableaux.
                • Partager sur Facebook
                • Partager sur Twitter
                  22 octobre 2008 à 23:22:57

                  OK merci j'arrive a faire fonctionner mon stringcopy. Je suis totalement d'accord sur "la folie " du
                  *tab_cal = re(tab_cal);
                  seulement je n'ai pas trouvé d'autre moyen pour que ma fonction renvoie correctement ma structure BETA car si je ne met pas ca j'obtient le message d'erreur suivant:
                  "incompatible types in return "
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 octobre 2008 à 23:39:58

                    pourquoi ne pas déclarer tab_cal en pointeur plutôt qu'en tableau, ça t'éviterais tous ces problèmes ...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 octobre 2008 à 0:09:59

                      Citation : sonicc

                      OK merci j'arrive a faire fonctionner mon stringcopy. Je suis totalement d'accord sur "la folie " du
                      *tab_cal = re(tab_cal);
                      seulement je n'ai pas trouvé d'autre moyen pour que ma fonction renvoie correctement ma structure BETA car si je ne met pas ca j'obtient le message d'erreur suivant:
                      "incompatible types in return "


                      C'est un problème sans véritable objet, tab_cal est un tableau donc toute tentative de le modifier dans son ensemble est invalide (en-dehors de l'initialisation, assez limitée), il faut bien accéder à chaque élément individuellement.

                      Avec une fonction du type de celle utilisée dans ton code (une fois corrigée, bien sûr) il n'y a aucun besoin de récupérer une valeur dans le tableau puisque celle-ci le modifie déjà (le "tab_cal" passé en paramètre de la fonction est une adresse et permet bien d'accéder aux divers éléments, contrairement à une "simple variable" qui nécessite de passer un pointeur pou être modifiée).

                      Peut-être la fonction saurait-elle renvoyer une valeur pour s'assurer de son bon déroulement (spontanémnt j'aurais renvoyé EXIT_FAILURE ou NULL pour signaler à main qu'on a pas pu ouvrir le fichier, ce n'est qu'un exemple).

                      Citation : joccd

                      pourquoi ne pas déclarer tab_cal en pointeur plutôt qu'en tableau, ça t'éviterais tous ces problèmes ...


                      Gne ? Il me semble que l'idée c'est de stocker les chaînes de caractères, j'aurais plutôt parlé de tableau bidimensionnel ou au pire d'un tableau de pointeur (selon la longueur des chaînes).
                      Mais je peux me tromper, je ne sais même pas si cette structure BETA est destinée à contenir d'autres choses ou s'il s'agît d'une maladresse.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      probléme avec un strcpy!!

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown