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
    Candidat au Club
    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
    Points : 2
    Points
    2
    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 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 401
    Points : 23 783
    Points
    23 783
    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 éprouvé
    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
    Points : 917
    Points
    917
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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.

  5. #5
    Candidat au Club
    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
    Points : 2
    Points
    2
    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
    Candidat au Club
    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
    Points : 2
    Points
    2
    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
    26 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 905
    Points : 220 151
    Points
    220 151
    Billets dans le blog
    126

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 401
    Points : 23 783
    Points
    23 783
    Par défaut
    Citation Envoyé par Devely Voir le message
    Tu a reconnu la NORME hein ?
    Hélas oui…

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    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.

  10. #10
    Membre éprouvé
    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
    Points : 917
    Points
    917
    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