Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème pour redéfinir les fonctions sur les chaines de caracteres

    30 mai 2006 à 19:51:18

    Bonjour a tous ! En tant qu'élève assidu , j'ai décidé d'écouter mateo21 et de tenter de redéfinir les fonctions que l'on apprend à utiliser dans le paragraphe sur les chaines de caractères. Mon problème concerne celle qui consiste à concaténer 2 chaines. Plus précisément à concaténer la chaine "2" dans la chaine "1".
    voici le prototype :
    char* strcat(char* chaine1, const char* chaine2);

    Tout d'abord j'ai une question : les étoiles sont elles obligatoires? Ne pourrais-je pas mettre plutôt :
    char concatener (char chaine1, const char chaine2);

    Ensuite je voudrais savoi comment définir cette fonction . Je me suis biensur deja posé sur la question (je pense être assez loin de la solution...soyez indulgents!! ;) ) :
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

    char concatener (char chaine1, const char chaine2);

    int main(int argc, char *argv[])
    {
        char chaine1[100]="salut ",chaine2[]="ca va";
       
        concatener(chaine1,chaine2);
       
        printf ("%s",chaine1);
       
           
      system("PAUSE");     
      return 0;
    } 

    char concatener (char chaine1, const char chaine2)

    {
         chaine1= chaine1 +chaine2;
         
         return chaine1;
         }


    Merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      30 mai 2006 à 20:34:06

      Citation : casus_orez

      Bonjour a tous ! En tant qu'élève assidu , j'ai décidé d'écouter mateo21 et de tenter de redéfinir les fonctions que l'on apprend à utiliser dans le paragraphe sur les chaines de caractères. Mon problème concerne celle qui consiste à concaténer 2 chaines. Plus précisément à concaténer la chaine "2" dans la chaine "1".
      voici le prototype :

      char* strcat(char* chaine1, const char* chaine2);


      Tout d'abord j'ai une question : les étoiles sont elles obligatoires? Ne pourrais-je pas mettre plutôt :

      char concatener (char chaine1, const char chaine2);


      Attention !

      Dans l'expression

      char* s;

      La variable s est un pointeur. En revanche dans l'expression :

      char c;

      La variable c est une variable 'normale'.

      Ce n'est donc pas du tout pareil.

      Citation : casus_orez

      char concatener (char chaine1, const char chaine2)
      {
           chaine1 = chaine1 + chaine2;
           
           return chaine1;
      }


      Ici, tu additionne deux caractères et tu place le résultat dans chaine1. Cela n'a rien à voir avec la concaténation de deux chaînes de caractères.

      Tu dois parcourir chaine1 jusqu'à sa fin ('\0'), puis copier chaine2 à partir de cette position.

      Essais avant de regarder la solution.

      Voici ton code corrigé (pose des questions si tu ne comprends pas) :

      Secret (cliquez pour afficher)
      char* cat(char *s, const char* t)
      {
          int i, j;

          i = j = 0;
          while (s[i] != '\0') /* va à la fin de s */
              i++;
          while ((s[i++] = t[i++]) != '\0') /* copie t */
              ;

          return s;
      }


      Cependant, ce code (tiré en partie du K&R (2.8)), peut-être écrit bien plus rapidement en utilisant les pointeurs :

      char* cat(char* s, const char* t)
      {
          while(*++s)
              ;
          while(*s++ = *t++)
              ;
          return s;
      }
      • Partager sur Facebook
      • Partager sur Twitter
        30 mai 2006 à 20:48:20

        Tout d'abord merci. Alors en ce qui concerne le code , je comprend le principe , cependant je ne comprend pas comment tu donnes des instructions comme :

        Citation : mleg

        char* cat(char *s, const char* t)
        {
        int i, j;

        i = j = 0;
        while (s[i] != '\0') /* va à la fin de s */
        i++;
        while ((s[i++] = t[i++]) != '\0') /* copie t */
        ;

        return s;
        }



        sans mettre de { } après ton while? (est ce pour abréger?)

        Ensuite (désolé d'insister), mais pourquoi utiliser des pointeurs dans la prototype? Alors que dans la fonction ce qui nous interresse c'est la valeur des variables.

        merci



        • Partager sur Facebook
        • Partager sur Twitter
          30 mai 2006 à 21:05:26

          Citation : casus_orez

          Tout d'abord merci. Alors en ce qui concerne le code , je comprend le principe , cependant je ne comprend pas comment tu donnes des instructions comme :

          char* cat(char *s, const char* t)
          {
              int i, j;

              i = j = 0;
              while (s[i] != '\0') /* va à la fin de s */
                  i++;
              while ((s[i++] = t[i++]) != '\0') /* copie t */
                  ;

              return s;
          }


          sans mettre de { } après ton while? (est ce pour abréger?)



          Oui. Comme il n'y a qu'une seule instruction, elles sont facultatives (on peut faire de même avec les autres blocs, mis à part les fonctions).

          L'instruction ';' est une instruction vide ("ne fais rien").

          Citation : casus_orez

          Ensuite (désolé d'insister), mais pourquoi utiliser des pointeurs dans la prototype? Alors que dans la fonction ce qui nous interresse c'est la valeur des variables.



          Il y a confusion là... strcat() concatène une chaine dans une autre... Revoir les chapitre II.1 : les pointeurs et II.2 : les tableaux si besoin.
          • Partager sur Facebook
          • Partager sur Twitter
            31 mai 2006 à 13:35:20

            ok merci!

            J'ai reproduit ton code et quand je veux l'exécuter , un message me disant "violation d'acces" apparait.
            Et la une ligne se met en bleu :

            while ((s[i++] = t[i++]) != '\0')
                    ;


            As tu une idée de pourquoi?

            • Partager sur Facebook
            • Partager sur Twitter
              31 mai 2006 à 13:50:01

              Parce que s n'est pas assez grand pour contenir t.
              • Partager sur Facebook
              • Partager sur Twitter

              problème pour redéfinir les fonctions sur les chaines de caracteres

              × 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