Partage
  • Partager sur Facebook
  • Partager sur Twitter

envoyer une chaine de caractere

    20 juillet 2008 à 17:26:06

    bonjour je voudrais savoir svp comment faire pour envoyer une chaine de caractère
    par une fonction avec un return merci
    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2008 à 17:27:26

      Citation : yossi

      bonjour je voudrais savoir svp comment faire pour envoyer une chaine de caractère
      par une fonction avec un return merci


      http://www.deezer.com/track/3897
      Lis le tutos de m@teo !
      • Partager sur Facebook
      • Partager sur Twitter
        20 juillet 2008 à 17:28:51

        dans quel partie il explique ça merci
        • Partager sur Facebook
        • Partager sur Twitter
          20 juillet 2008 à 17:31:09

          sur la partie des fonctions.
          Il t'apprends a retourner des variables.
          Avec de la logique, tu aurais compris : une chaine, c'est quoi, comme variable ?
          • Partager sur Facebook
          • Partager sur Twitter
            20 juillet 2008 à 17:37:51

            Xhtml_boys, tu oublies de parler de l'allocation dynamique. Si tu lui dis qu'on peut renvoyer une chaîne statique comme une variable classique... Bah tu lui mens.

            Il faut donc allouer dynamiquement une chaine dans ta fonction, puis returner un pointeur sur cette chaine. La fonction appelante va alors récupérer le pointeur, et pourra manipuler facilement la chaine au travers de ce dernier.

            Il ne faut bien sûr pas oublier de libérer la chaine depuis la fonction appelante quand tu as fini avec.
            • Partager sur Facebook
            • Partager sur Twitter
            J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
              20 juillet 2008 à 17:49:06

              on envoie par un return ou avec les pointeur si c'est avec un return quesque qu'il faut r'ajouter
              • Partager sur Facebook
              • Partager sur Twitter
                20 juillet 2008 à 17:52:09

                Citation : GuilOooo

                Xhtml_boys, tu oublies de parler de l'allocation dynamique. Si tu lui dis qu'on peut renvoyer une chaîne statique comme une variable classique... Bah tu lui mens.

                Il faut donc allouer dynamiquement une chaine dans ta fonction, puis returner un pointeur sur cette chaine. La fonction appelante va alors récupérer le pointeur, et pourra manipuler facilement la chaine au travers de ce dernier.

                Il ne faut bien sûr pas oublier de libérer la chaine depuis la fonction appelante quand tu as fini avec.


                effectivement...
                Mais bon, il me semble que c'est expliquer dans le cour de l'allocation, tout ça, donc il l'a appris, si iol a finit de lire le cours de m@teo.

                Citation : yossi

                on envoie par un return ou avec les pointeur si c'est avec un return quesque qu'il faut r'ajouter


                rien.
                regarde les fonctions de manipulation de chaine, tu verras ce qui change d'une fonction qui retourne un int, par exemple, après, sa change rien au niveau du return.
                char *tafonction(char *chaine)
                {
                    return chaine;
                }
                
                • Partager sur Facebook
                • Partager sur Twitter
                  20 juillet 2008 à 17:59:59

                  char fonction()
                  {
                     char ma_chaine[6]="";
                     ma_chaine="Hello";
                     return ma_chaine;
                  }
                  

                  Non :euh: ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 juillet 2008 à 18:05:14

                    Citation : dunedune

                    char fonction()
                    {
                       char ma_chaine[6]="";
                       ma_chaine="Hello";
                       return ma_chaine;
                    }
                    


                    Non :euh: ?



                    Une erreur par ligne, pas mal. Il ne faut pas poster si on est pas sûr.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      20 juillet 2008 à 18:05:54

                      j'essaie de copier une chaine de caractère par une fonction mais je vois pas ou est le problème voici ce que j'ai marque
                      merci

                      char* mot2(char* mot,char* copieMot)
                      {

                      copieMot = mot ;


                      return copieMot ;
                      }

                      int main(int argc, char *argv[])
                      {
                      char mot[10] = "bonjour";
                      char copieMot[10] = {0};

                      copieMot = mot2(mot ,copieMot);
                      printf("%s\n",mot1);
                      system("PAUSE");
                      return 0;
                      }

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        20 juillet 2008 à 18:08:44

                        PHP != C.
                        char * != char [] toussa aussi.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 juillet 2008 à 18:29:47

                          j'ai rien compris c'est sensé être une réponse
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 juillet 2008 à 21:06:51

                            Je pense que si tu suis les réponses de -ed- sur ce post...
                            http://www.siteduzero.com/forum-83-299 [...] n-strlen.html
                            Tu devrais avoir les réponses attendues...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 juillet 2008 à 21:18:01

                              Citation : yossi

                              j'essaie de copier une chaine de caractère par une fonction mais je vois pas ou est le problème voici ce que j'ai marque
                              merci

                              char* mot2(char* mot,char* copieMot)
                              {
                              
                              copieMot = mot ; 
                              
                              
                              return copieMot ; 
                              }
                              
                              int main(int argc, char *argv[])
                              {
                              char mot[10] = "bonjour";
                              char copieMot[10] = {0};
                              
                              copieMot = mot2(mot ,copieMot);
                              printf("%s\n",mot1);
                              system("PAUSE"); 
                              return 0;
                              }
                              

                              Encore une fois, tu as un gros probleme avec les chaines de caracteres.

                              Je m'auto cite, ca t'aidera peut etre :

                              Citation : moi

                              On retrouve extrêmement souvent sur le forum cette phrase, qui n'est pas dénuée de sens, mais manque de précision : "une chaine est un pointeur sur le premier élément du tableau".

                              La réalité est plus simple, mais O combien complexe :p : une chaine est un tableau de char.
                              Elle se manipule avec un pointeur sur le premier élément du tableau.
                              C'est pourquoi, on manipule très souvent les chaines avec le type char*, qui n'est pourtant pas le prototype d'une chaine a proprement parler...

                              On ne devrait pas écrire :

                              /* Ceci n'est pas la définition d'une chaine,
                              mais un pointeur sur une zone mémoire (généralement 
                              de type const) ou se trouve la chaine "Salut" */
                              char* chaine = "Salut";
                              


                              mais seulement :

                              char chaine[] = "Salut";
                              



                              char* chaine peut soit être égal a NULL, soit pointer sur le debut (premier caractere) d'une zone mémoire correspondant a une chaine (définie ou non). Cette chaine (si elle est définie et valide) correspond a une suite de caractères en mémoire jusqu'à arriver a un caractère nul ('\0').



                              chaine1 = chaine2 ne veut rien dire, car chaine1 et chaine2 sont des pointeurs.
                              De meme, *chaine1 = *chaine2 ne suffira pas, car tu dois traiter tous les caracteres et pas seulement le premier...
                              le plus simple est une boucle :
                              int n = 0;
                              while(chaine[n] != '\0')
                              {
                                 chaine1[n] = chaine2[n];
                                 n++;
                              }
                              chaine1[n] = chaine2[n]; /*on termine par \0*/
                              


                              ps: pense aux balise code, et a l'indentation...
                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 juillet 2008 à 22:00:49

                                Bonsoir !

                                // Par yoch, le 20/07/2008
                                
                                int n = 0;
                                while(chaine2[n] != '\0')
                                {
                                   chaine1[n] = chaine2[n];
                                   n++;
                                }
                                chaine1[n] = chaine2[n];
                                


                                Hm... intéressant, c'est le moins que je puisse dire :p
                                En effet, je n'ai pas fait ainsi et... j'aurais dû.

                                (Il y avait une ch'tite erreur : la condition du "while" était incohérente, la variable "chaine" n'existant apparemment pas. Il faut la remplacer par la variable "chaine2" pour que la fonction opère correctement.)

                                int stringLength(const char string[])
                                {
                                    int i;
                                    for (i = 0 ; string[i] != '\0' ; i++);
                                    return i;
                                }
                                
                                void stringCopy(char string[], const char stringToCopy[])
                                {
                                    int i, strLength;
                                    strLength = stringLength(stringToCopy) + 1;
                                
                                    for (i = 0 ; i < strLength ; i++)
                                    {
                                        string[i] = stringToCopy[i];
                                    }
                                }
                                


                                Comme vous pouvez le voir, ma solution est beaucoup plus longue et moins élégante.
                                Merci, je me souviendrai de cette idée !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 juillet 2008 à 23:07:56

                                  Ma solution a pour but simplicité et lisibilité, sinon on peut faire encore plus court (full pointeur) :
                                  char *my_strcpy (char *dest, const char *src)
                                  {
                                      char *ret = dest;
                                      while (*dest++ = *src++);
                                      return ret;
                                  }
                                  
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 juillet 2008 à 0:48:39

                                    Xhtml_boys> ton premier lien est un peu hors sujet...

                                    bon... une grande regle generale, quand vous renvoyez un pointeur, ne renvoyez pas un truc qui est sur la stack mais apres ebp...

                                    en clair : NE FAITES PAS de retours de TABLEAUX declares localement !

                                    sinon :

                                    char *a, *b;
                                    a= foo();
                                    b= foo();

                                    en fait, vous aurez probablement a et b qui pointent vers le meme endroit...

                                    #include <stdio.h>
                                    #include <stdlib.h>
                                    
                                    char * foo(int a){
                                    	char buffer[100];
                                    	sprintf(buffer, "<<%d>>", a);
                                    	return buffer;
                                    }
                                    
                                    void bar(){
                                    	char foo = 'D';
                                    	char bar = ':';
                                    	printf("%c %c\n", foo, bar);
                                    }
                                    
                                    int main(){
                                    	char *a, *b;
                                    	a = foo(7);
                                    	b = foo(9);
                                    	/*/
                                    	bar();
                                    	/**/
                                    	printf("a = {%s}\tb = {%s}\n", a, b);
                                    	return 0;
                                    }
                                    

                                    ca m'affiche ca :
                                    a = {<<42>>} b = {<<42>>}
                                    bah ouais, c'est au meme emplacement sur la stack...

                                    decommentez le bar, et ca fout la merde....
                                    pourtant, cette fonction "semblait" ne pas provoquer d'effet de bord...
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 juillet 2008 à 22:29:45

                                      bonsoir yoch tu m'as dis que chaine =chaine1 ne veut rien dire pourtant quand je fait ça ,ça copie chaine dans chaine1 car lorsque que je fait un printf sur les deux (chaine et chaine1) il me marque les deux la même chose mais cela marche que dans une fonction mais pas dans le main.c mais mon problème c'est que j'arrive pas a renvoyer chaine1 de la fonction au main.c merci d'avance
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        25 juillet 2008 à 9:27:55

                                        Je m'explique :

                                        Tu cherche a copier une chaine de caractère dans une autre, c'est bien cela ?

                                        Dans ce cas, ta méthode n'est pas vraiment adaptée...
                                        En effet, les chaines de caractères sont des tableaux (de char), donc chaine1 n'est pas vraiment une chaine, mais plutôt un pointeur sur le premier élément de la chaine (équivalent a &chaine1[0]), ce qui permet de la manipuler aisément.

                                        Lorsque tu écris cette affectation : chaine2 = chaine1, tu ne copie donc pas chaine1 dans chaine2, mas tu affecte au pointeur chaine2 la valeur du pointeur chaine1. Les deux pointent alors sur la même chaine.

                                        Cette affectation marcheras localement dans la fonction, et marchera aussi si tu utilise un pointeur dans le main, comme ceci :
                                        #include <stdio.h>
                                        
                                        char* mot2(char* mot, char* copieMot)
                                        {
                                            copieMot = mot ;
                                            return (copieMot);
                                        }
                                        
                                        int main(void)
                                        {
                                            char mot[10] = "bonjour";
                                            char *copieMot = NULL;  /* pointeur et non chaine */
                                            copieMot = mot2(mot, copieMot);
                                            puts(copieMot);
                                            return 0;
                                        }
                                        

                                        mais n'est en aucun cas une copie...

                                        Pour effectuer une copie, tu dois employer deux chaines de taille suffisante, et copier caractère par caractère (sans oublier '\0' a la fin). J'ai donné plus haut des exemples de codes.

                                        EDIT: pour répondre a ta question originale (1er post), voici une réponse intéressante de -ed- : http://www.siteduzero.com/forum-83-302 [...] html#r2782219
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          25 juillet 2008 à 11:14:59

                                          bonjour yoch tu m'a dis que chaine1 = chaine n'est pas une copie
                                          j'ai essaye avec une boucle pas comme tu l'a fait pas la boucle while mais for est ca a change la valeur de chaine1 aussi dans le main.c est sans return dis moi stp si c'est bien une copie et si oui alors pourquoi le prototype qu'il donne est un char* et pas un void il ne renvoie rien pourtant voici ce que j'ai ecrie

                                          void copier(char* chaine ,char* chaine1)
                                          {
                                          long i=0 , u=0;
                                          for (i=0;i<10;i++)
                                          chaine1[i]=chaine[i];


                                          }

                                          je m'excuse de ne pas l'avoir mis en blancs mais je n'arrive pas a le faire si tu pourrais me dire comment ça serait gentille merci


                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            25 juillet 2008 à 11:21:25

                                            char * copier(char* chaine){
                                             char * foo = malloc(strlen(chaine)+1);
                                             int i=0;
                                             while(chaine[i]!=0){ foo[i]=chaine[i]; i++; }
                                             foo[i]=0;
                                             return foo;
                                            }
                                            
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              25 juillet 2008 à 11:34:15

                                              Salut,

                                              C'est très bien, tu t'approche !

                                              Quelques remarques :
                                              • poste toujours un code compilable, c'est sympa pour ceux qui t'aident.
                                              • mets le code entre balises code, comme ceci : <code type="c">ton code</ code> (pas d'espace dans la deuxième balise)

                                              Revenons a ton code, que voici (un peu corrigé) :
                                              #include <stdio.h>
                                              
                                              void copier(char* chaine ,char* chaine1)
                                              {
                                                  int i; /* int suffit ; pas besoin d'initialiser, le for s'en charge */
                                                  for (i=0; i<10; i++)
                                                  {
                                                      chaine1[i]=chaine[i];
                                                  }
                                              }
                                              
                                              int main(void)
                                              {
                                                  char mot[10] = "bonjour";
                                                  char copieMot[10];
                                                  copier(mot, copieMot);
                                                  puts(copieMot);
                                                  return 0;
                                              }
                                              


                                              Ce code fonctionne déjà, et c'est bien une copie...

                                              Il reste néanmoins un défaut :
                                              tu mets le for de 0 a 9, c'est très bien ici, mais en règle générale ta fonction ne connait pas d'elle même la taille du tableau. C'est la raison pour laquelle dans mon code plus haut j'utilise le caractère nul de fin de chaine ('\0', soit 0) pour arrêter la copie.

                                              Pour ce qui est du type de la fonction, un void suffit en effet, mais on utilise un souvent un char*, pour des raisons pratiques, comme pouvoir faire comme ceci par exemple:
                                              #include <stdio.h>
                                              
                                              char* copier(char* chaine ,char* chaine1)
                                              {
                                                  int i;
                                                  for (i=0; i<10; i++)
                                                  {
                                                      chaine1[i]=chaine[i];
                                                  }
                                                  return chaine1;
                                              }
                                              
                                              int main(void)
                                              {
                                                  char mot[10] = "bonjour";
                                                  char copieMot[10];
                                                  puts(copier(mot, copieMot)); /* a toi d'analyser cette ligne ! */
                                                  return 0;
                                              }
                                              


                                              EDIT :

                                              Citation : coucou747

                                              char * copier(char* chaine){
                                               char * foo = malloc(sizeof(chaine)+1);
                                               int i;
                                               while(chaine[i]!=0){ foo[i]=chaine[i]; i++ }
                                               foo[i]=0;
                                               return foo;
                                              }


                                              Ce code est une horreur sans nom, a ne surtout pas mettre entre les mains d'un débutant... Y a pas mieux pour provoquer des fuites mémoires. Et puis utiliser malloc pour une fonction comme strcpy est parfaitement déplacé...
                                              de plus, il fait bien plus de lignes que ce que tu cherche a faire croire...

                                              Tout d'abord, poste un code complet/compilable, avec les bonnes balises... :
                                              #include <stdio.h>
                                              #include <stdlib.h>
                                              
                                              char* copier(char* chaine)
                                              {
                                                  char* foo = malloc(sizeof(chaine)+1);  /*ceci est completment faux, essaie avec une grande chaine voir...*/
                                                  int i = 0;  /* initialise i*/
                                                  while (chaine[i] != 0)
                                                  {
                                                      foo[i]=chaine[i];
                                                      i++; /*oubli de ;*/
                                                  }
                                                  foo[i] = 0;
                                                  return foo;
                                              }
                                              
                                              int main(void)
                                              {
                                                  char mot[10] = "bonjour";
                                                  char* s = copier(mot);
                                                  puts(s);
                                                  free(s);  /* on libère la mémoire */
                                                  return 0;
                                              }
                                              

                                              sizeof(chaine) renvoie la taille d'un pointeur, chez moi 4...
                                              et même si ça marchait, inutile de faire +1 :p
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                25 juillet 2008 à 11:47:43

                                                <code type="c">copier(mot, copieMot); puts(copieMot)</ code>;


                                                j'ai essaye ce que tu m'a dit ça m'écris le le mot sans avoir besoin d'ecrire printf mais comment ca marche au juste merci


                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  25 juillet 2008 à 11:51:45

                                                  la bonne balise de fermeture est (enlève l'espace) :</code>
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    25 juillet 2008 à 11:52:52

                                                    Citation : yossi

                                                    ça m'écris le le mot sans avoir besoin d'ecrire printf mais comment ca marche au juste merci



                                                    puts est une fonction qui écrit la chaîne que tu lui passes en paramètre sur la sortie standard (ta console, en l'occurence). Elle ajoute un '\n' automatiquement.

                                                    Y'a pas que printf dans la vie...
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    J'ai déménagé sur Zeste de savoir — Ex-manager des modérateurs.
                                                      25 juillet 2008 à 12:12:27

                                                      Citation : dunedune

                                                      char fonction()
                                                      {
                                                         char ma_chaine[6]="";
                                                         ma_chaine="Hello";
                                                         return ma_chaine;
                                                      }
                                                      


                                                      Non :euh: ?


                                                      Bah, non

                                                      1 - Ça ne compile pas ( '=' pour un tableau ? strcpy(), ça te parle ?)
                                                      2 - retour de l'adresse d'un tableau local : comportement indéterminé (l'adresse est invalide après le return).
                                                      3 - type retourné incohérent...
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Music only !
                                                        25 juillet 2008 à 12:48:18

                                                        Lieber yoch, si un noob ne sait pas faire un free, c'est sa faute, pas la mienne...

                                                        je pensais strlen dans ma tete, mais j'ai mis sizeof par erreur (reflexe dans un malloc...)

                                                        bref, c'est edited.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          25 juillet 2008 à 12:57:02

                                                          @coucou747:

                                                          Salut,

                                                          Je ne suis pas tout a fait d'accord. Ton code me parait compliqué, et nous sommes sur le site du zéro, ne l'oublions pas...

                                                          De plus, ton code perd de plus en plus son intérêt : a quoi sert de recoder strcpy, si c'est pour avoir besoin de malloc et strlen...

                                                          De plus, tu n'as toujours pas corrige les 2 autres erreurs que je te signale.
                                                          En passant, mets donc les bonnes balises <code type="c">...

                                                          Et ton code n'est toujours pas très safe (bon, ok, je chipote la ;) ), essaie ceci :
                                                          #include <stdio.h>
                                                          #include <string.h>
                                                          #include <stdlib.h>
                                                          
                                                          char* copier(char* chaine)
                                                          {
                                                              char* foo = malloc(strlen(chaine)+1);
                                                              int i = 0;
                                                              while (chaine[i] != 0)
                                                              {
                                                                  foo[i]=chaine[i];
                                                                  i++;
                                                              }
                                                              foo[i] = 0;
                                                              return foo;
                                                          }
                                                          
                                                          int main(void)
                                                          {
                                                              char mot[10];
                                                              char* s = copier(mot);
                                                              puts(s);
                                                              free(s);  /* on libère la mémoire */
                                                              return 0;
                                                          }
                                                          


                                                          @+
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            25 juillet 2008 à 13:33:21

                                                            le code que tu viens d'écrire et que tu n'était pas d accord avec l'autre a cause qu'il était complique c'était pour qui pour yossi ou pour celui qui a écris juste avant et dans ton code y avais un mot free je ne connais pourrais tu m'explique a quoi il sert stp
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              25 juillet 2008 à 13:35:40

                                                              si tu connais malloc, alors tu dois connaitre free...

                                                              malloc alloue de la memoire
                                                              free la libere.

                                                              si t'es sous linux, installe valgrind, et lance tes programmes comme ceci :

                                                              valgrind ./programme

                                                              tu vois alors toutes les erreurs de gestion de la memoire.
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              envoyer une chaine de caractere

                                                              × 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