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

Bibliothèque standard C Discussion :

Recoder la fonction strcat


Sujet :

Bibliothèque standard C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut Recoder la fonction strcat
    Bonjour,

    Je suis en train de recoder la fonction strcat de la lib string.h
    Après avoir écrit mon code, vérifié et revérifié, mon programme SegFault.
    Pouvez vous m'aider ?

    Voici le code :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    char	my_putchar(char c)
    {
      write(1, &c, 1);
    }
     
    char	my_putstr(char *str)
    {
      char i;
     
      i = 0;
      while(str[i] != '\0')
        {
          my_putchar(str[i]);
          i = i + 1;
        }
      return (0);
    }
     
    int	my_strlen(char *str)
    {
      int	i;
     
      i = 0;
      while(str[i] != '\0')
        {
          i = i + 1;
        }
      return (i);
    }
     
    char	*my_strcat(char *dest,char *src)
    {
      int i = my_strlen(dest); 
      int j = 0; 
     
      while (src[j] != '\0') 
        { 
          dest[i] = src[j];
          i++;
          j++; 
        } 
      dest[i + j] = '\0'; 
     
      return (dest); 
    }
     
    int	main()
    {
      char	*src;
      char	*dest;
     
      src = "sal";
      dest = "tro";
      my_strcat(dest, src);
      return (0);
    }
    Cordialement.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 452
    Par défaut
    Bonjour,
    • Ligne 42, c'est dest[i] et pas dest[i+j] ;
    • Juste pour le principe, on net met pas de parenthèses à l'argument de return : ce n'est pas une fonction.


    Mais surtout :

    • Si tu veux concaténer des chaînes, il faut s'assurer que tu disposes de l'espace suffisant après la chaîne de destination et, pour cela, il faut le réserver à l'avance. Dans ta fonction main, non seulement tu ne le fais pas, mais tu essaies de concaténer des chaînes constantes. Le programme va donc essayer d'aller concaténer ta chaîne source dans un espace en lecture seule.

  3. #3
    Membre éclairé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Par défaut
    Bonjour,

    Je crois que je ne le dirais jamais assez : VALGRIND

    C'est outil est magique car il détecte les segfaults à la ligne près, surtout dans un code comme le tien.

    Et puis bonne nouvelle, il est installé par default sur les dumps Epitech (ne nie pas )

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Comme l'a dit Obsidian, ton main est pourri:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int	main()
    {
      char	*src;
      char	*dest;
     
      src = "sal";  /*Les chaînes littérales sont dans une mémoire en lecture seule*/
      dest = "tro"; /*Un gcc bien configuré te le dirait: -Wwrite-strings*/
      my_strcat(dest, src); /*Boum! Tu cherches à écrire dans la mémoire read-only après "tro"*/
      return (0);
    }
    Bien sûr, la correction est simple (char dest[7] = "tro";). Mais l'important, c'est de la comprendre. Et d'ajouter l'option -Wwrite-strings pour gcc, afin de ne pas répéter la même erreur.

    PS: Les nombres magiques, c'est le mal. Utilise STDOUT_FILENO au lieu de 1 pour le descripteur de la sortie standard.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    Merci pour vos réponses les gars !

    j'ai corrigé les l'erreur a la ligne 42. Mais ca ne marche toujours pas même avec un malloc dans le main. Je pensais utiliser la fonction strdup dans ma fonction car elle fait un malloc. Bonne idée ??

    EpiTouille : Non nos dumps sont pourris et il n'y a pas de debugger... Tu a reconnu la NORME hein ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Par défaut
    Ou pouvez vous me montrer comment utiliser malloc dans ma fonction main svp ?

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 073
    Billets dans le blog
    144
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 452
    Par défaut
    Citation Envoyé par Devely Voir le message
    Tu a reconnu la NORME hein ?
    Hélas oui…

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    strdup() ne marchera pas, puisque pour concaténer il faut réserver assez pour les longueurs des deux chaînes, et strdup() ne réserve que pour la chaîne qu'il duplique.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre éclairé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Par défaut
    Et il y a valgrind installé sur les dumps sauf si tu as un dump différent des autres, mais permet moi d'en douter. (gdb est aussi installé par default)

Discussions similaires

  1. Problème avec la fonction strcat
    Par saddamtohmto dans le forum MATLAB
    Réponses: 10
    Dernier message: 18/07/2007, 07h57
  2. Problème avec la fonction Strcat
    Par totoc1001 dans le forum MATLAB
    Réponses: 6
    Dernier message: 29/01/2007, 21h34
  3. Réponses: 19
    Dernier message: 29/10/2006, 10h17
  4. recoder la fonction cat
    Par Pitou5464 dans le forum C
    Réponses: 13
    Dernier message: 17/10/2006, 20h22
  5. Pb avec fonction strcat ?
    Par olivier857 dans le forum Réseau
    Réponses: 44
    Dernier message: 31/03/2006, 12h00

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