Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajouter un caractère à une position définie

    11 février 2019 à 17:20:49

    Bonjour !

    Je suis entrain d'essayer d'implémenter une fonction permettant d'ajouter un caractère à une position donné dans une chaîne de caractère (char * ).

    En mode débug je peux voir que mon insertion se passe bien, mais lorsque j'essaye d'écraser mon ancien pointeur, là je perd toutes mes donnée...

    Une idée ?

    void appendCharact(char * source, char carac , int position)
    {
    	char * temp = (char*) malloc((strlen(source)+2)*sizeof(char));
    	int i;
    	for(i = 0 ; i < position ; i++)
    	{
    		temp[i] = source[i];
    	}
    
    	temp[position] = carac;
    	for(i = position ; i < strlen(source) ; i++)
    	{
    		temp[i+1] = source[i];
    	}
    	temp[strlen(temp)+1] = '\0';
    	free(source);
    	source = temp;
    
    }



    • Partager sur Facebook
    • Partager sur Twitter
      11 février 2019 à 18:46:28

      char *appendCharact(char * source, char carac , int position)
      {
      	char * temp = (char*) malloc((strlen(source)+2)*sizeof(char));
      	int i;
      	for(i = 0 ; i < position ; i++)
      	{
      		temp[i] = source[i];
      	}
      
      	temp[position] = carac;
      	for(i = position ; i < strlen(source) ; i++)
      	{
      		temp[i+1] = source[i];
      	}
      	temp[strlen(temp)+1] = '\0';
      	free(source);
      	return(temp);
      
      }



      ou bien

      void            appendCharact(char **source, char carac , int position)
      {
          char        *temp = (char*) malloc((strlen(source[0])+2)*sizeof(char));
          int         i;
      
          for(i = 0 ; i < position ; i++)
          {
              temp[i] = source[0][i];
          }
          temp[position] = carac;
          for(i = position ; i < strlen(source[0]) ; i++)
          {
              temp[i+1] = source[0][i];
          }
          temp[strlen(temp) + 1] = '\0';
          free(source[0]);
          source[0] = temp;
      }
      
      int             main()
      {
        char          *str = malloc(sizeof(char) * 4);
      
        str[0] = 'l';
        str[1] = 'o';
        str[2] = 'l';
        str[3] = 0;
        appendCharact(&str, '!', 3);
        printf("%s\n", str);
        return (0);
      }


      ou bien tu retournes ta variable ou bien tu envoies un pointeur sur cette variable sinon qd tu quittes ta fonction tu perds la modification.

      -
      Edité par BobbyLa Courgette 11 février 2019 à 18:55:23

      • Partager sur Facebook
      • Partager sur Twitter
        11 février 2019 à 19:45:33

        Je te remercie d'avoir pris le temps de me répondre, je ne comprend pas la 2eme méthode, pourquoi utilisé un double pointeur ? 

        Merci !

        • Partager sur Facebook
        • Partager sur Twitter
          11 février 2019 à 20:12:33

          Hello,

          En C, lorsqu'une variable est passée à fonction, c'est par copie. Ce qui veut dire que si la variable (de la fonction) a bien le bon contenu, elle n'a pas la même adresse que la variable de l'appelant. Ce sont donc deux variables différentes.

          Tu peux donc, dans la fonction, modifier autant que tu veux la variable, cela ne sera pas répercuté sur la variable de la fonction appelante:

          void called(int var) {
              var=var+1;
          }
          
          void caller(void) {
              int var;
          
              var=1;
              printf("var=%d\n",var);    // 1 est affiché
              called(var);
              printf("var=%d\n",var);    // 1 est affiché
          }

          Si tu veux modifier une variable passée à une fonction, tu dois en fournir l'adresse:

          void called(int *var) {
              *var=*var+1;
          }
          
          void caller(void) {
              int var;
          
              var=1;
              printf("var=%d\n",var);    // 1 est affiché
              called(&var);
              printf("var=%d\n",var);    // 2 est affiché
          }

          -
          Edité par edgarjacobs 11 février 2019 à 22:54:49

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            11 février 2019 à 23:34:34

            Hello !

            Donc si j'ai bien compris, si tu passes en paramètre "**ptr" tu passes donc l'adresse d'une adresse ? Le double pointeur je voyais ca plustot comme une matrice ou un tableau de tableau.

            • Partager sur Facebook
            • Partager sur Twitter
              13 février 2019 à 23:41:24

              Re,-

              ThomasDenneulin4 a écrit:

              Le double pointeur je voyais ca plustot comme une matrice ou un tableau de tableau.

              Aussi, mais pas uniquement:
              #include <stdio.h>
              #include <stdlib.h>
              #include <string.h>
              
              void f(char **str) {
              	free(*str);
              	*str=malloc(11);
              	strcpy(*str,"texte deux");
              }
              
              int main(void) {
              	char *str;
              	
              	str=malloc(9);
              	strcpy(str,"texte un");
              	puts(str);
              	f(&str);
              	puts(str);
              	free(str);
              	
              	return(0);
              }
              



              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                21 février 2019 à 16:42:17

                ThomasDenneulin4 a écrit:

                Hello !

                Donc si j'ai bien compris, si tu passes en paramètre "**ptr" tu passes donc l'adresse d'une adresse ? Le double pointeur je voyais ca plustot comme une matrice ou un tableau de tableau.


                Je sais pas si ca sera plus claire pour toi mais **ptr c'est un pointeur sur pointeur, quand tu envois &ptr de *ptr qui donnera **ptr, tu envois l'adresse d'un pointeur.

                D'une certaine manière, un pointeur est une variable normale, si tu veux pouvoir la modifier dans une autre fonction, tu dois envoyer l'adresse de cette variable ou bien la retourner.

                **ptr peut être un double tableau ou pas. En fait, c'est toujours un double tableau à condition que tu acceptes que taille_longueur=taille_largeur=1 :)

                 Juste au cas ou car j'ai l'impression de pas être hyper clair et je voudrais pas t'embrouiller :)

                #include <stdio.h>
                
                void            fonction_3(int ***i)
                {
                  printf("%d\n", ***i); //affiche 1                                             
                  printf("%d\n", i[0][0][0]); //affiche 1                                       
                  printf("%d\n", *i[0][0]); //affiche 1                                         
                  printf("%d\n", **i[0]); //affiche 1                                           
                }
                
                void            fonction_2(int **i)
                {
                  printf("%d\n", **i); //affiche 1                                              
                  printf("%d\n", i[0][0]); //affiche 1                                          
                    printf("%d\n", *i[0]); //affiche 1                                          
                  fonction_3(&i);
                }
                
                void            fonction_1(int *i)
                {
                  printf("%d\n", *i); //affiche 1                                               
                  printf("%d\n", i[0]); //affiche 1                                             
                  fonction_2(&i);
                }
                
                int             main()
                {
                  int           i = 1;
                
                  printf("%d\n", i); //affiche 1                                                
                  fonction_1(&i);
                }
                





                -
                Edité par BobbyLa Courgette 21 février 2019 à 16:56:18

                • Partager sur Facebook
                • Partager sur Twitter

                Ajouter un caractère à une position définie

                × 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