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

C Discussion :

Insertion d'un chaîne de caractères dans une autre à une position donnée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Par défaut Insertion d'un chaîne de caractères dans une autre à une position donnée
    Bonjour,

    Je souhaiterais créer une fonction void strinsert(char*M,char*T,int i) qui insère un mot T dans un mot M à la position i, en utilisant les fonctions du string.h et les tableaux dynamiques
    Aidez-moi svp

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Hello,

    Il faut déplacer les caractères de la position M[i] en M[i+strlen(T)] sur une longueur de strlen(M[i])+1 (pour copier le \0) avec movmem() memmove(), puis faire un memcpy() de strlen(T) caractères de T en M[i].

    Bon, à part ça, peux-tu nous montrer ce que tu as essayé ?

    Ici tu auras de l'aide, mais pas du code.

    Edit: correction grâce à Sve@r: bien sûr, pas movmem() mais memmove()

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    S'agit-il d'un exercice d'école ou d'un travail pour toi ?
    Si c'est pour toi alors tu peux utiliser les fonctions memmove et conseurs citées par edgarjacobs. Si c'est pour l'école, alors à mon avis il te faudra écrire tout le code toi-même (si j'étais prof c'est ce que je demanderais). Dans ce cas, en admettant que le mot "T" ait une longueur de "t" caractères, il te faut décaler les caractères du mot "M" situés à la position "i" de "t" caractères. Une fois ces caractères décalés, tu pourras alors y mettre ceux du mot "T".
    Attention, le décalage doit se faire en commençant par la fin et en remontant vers la position "i". Parce que si tu veux insérer "xy" dans le mot "Hello" à la position (par exemple) 2 (donc au "e"), si tu commences par la gauche et que tu déplaces le "e" de 2 positions, alors le mot deviendra "Heleo". Ensuite tu décales le "l" et ça devient "Helel". Et ensuite tu arrives à la 4° position qui contient maintenant un "e" que tu décales encore et le mot devient "Helee" puis "Helel" puis "Helele" puis au final "Helelel".
    Donc tu commences par la fin et "Hello" devient alors "Hello.o" puis "Hellolo" puis "Hellllo" puis "Helello". Et ensuite tu insères "xy" à la position "2" et le mot devient au final "Hxyello" ce qui correspond à ce qui est attendu.

    Et bien évidemment, on peut corriger ton code mais on ne t'en fournira pas un tout fait.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    S'agit-il d'un exercice d'école ou d'un travail pour toi ?
    Si c'est pour toi alors tu peux utiliser les fonctions memmove et conseurs citées par edgarjacobs. Si c'est pour l'école, alors à mon avis il te faudra écrire tout le code toi-même
    (...)
    Je ne pense pas qu'il doive recoder memmove si "en utilisant les fonctions du string.h" indiquée par joujou98 dans son message d'origine fait partie de son énoncé, en effet, c'est bien une fonction accessible par string.h ...

    En ce qui concerne l'exigence "en utilisant les (...) tableaux dynamiques", c'est un peu plus flou, car cette notion n'existe pas vraiment en C. Il est sans doutes question d'une zone mémoire pointée par un pointeur sur char, allouée avec malloc et qu'on pourrait agrandir avec realloc pour ajuster la capacité d'accueil de la zone mémoire de destination.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par -Eks- Voir le message
    Je ne pense pas qu'il doive recoder memmove si "en utilisant les fonctions du string.h" indiquée par joujou98 dans son message d'origine fait partie de son énoncé, en effet, c'est bien une fonction accessible par string.h ...
    Bien vu
    Mais ça facilite grandement le TP !!! Punaise en 2 lignes c'est réglé quoi.

    Citation Envoyé par -Eks- Voir le message
    allouée avec malloc et qu'on pourrait agrandir avec realloc pour ajuster la capacité d'accueil de la zone mémoire de destination.
    Ah, là je suis moins d'accord. La taille finale est connue dès le départ puisque c'est la somme des deux chaines. Donc un malloc suffit. Pas besoin d'agrandir
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    La taille finale est connue dès le départ puisque c'est la somme des deux chaines. Donc un malloc suffit. Pas besoin d'agrandir
    Notre ami nous dit que le prototype est void strinsert(char*M,char*T,int i), et que la fonction "insert un mot T dans un mot M à la position i" (sic). On peut déduire donc que la fonction sert à obtenir une chaîne plus grande que la chaîne de départ, et que la chaîne plus grande et la chaîne de départ sont toutes deux pointées par M, comme le suggère aussi le type void de la fonction, qui ne sert donc pas à récupérer un résultat.

    Il faudra bien, en tout état de cause, décider qui a la responsabilité de s'assurer que l'espace alloué sur M est suffisant et de traiter le cas s'il ne l'est pas. Cela peut être la fonction elle même, ou la fonction appelante.

    • Si l'on prend le parti que cela soit la fonction strinsert, comme le prototype de la fonction ne comprend pas la taille mémoire allouée sur M, tout ce que peut faire la fonction c'est faire un realloc ajusté à la taille effectivement nécessaire au stockage final (qui suppose donc que M ait été initialement allouée avec un malloc préalable).
    • Si l'on décide que c'est de la responsabilité de la fonction appelante que de s'assurer que l'espace mémoire alloué pointé par M est suffisant, la fonction strinsert prendra pour acquis que l'espace est suffisant, et alors la façon dont la mémoire est allouée sur M importe peu, malloc ou pas, et M pourrait être un tableau de char dans lequel la fonction appelante s'assure que l'espace disponible est suffisant (dans ce dernier cas, pas d'allocation dynamique. Mais alors, je ne sais pas si on pourrait parler de "tableau dynamique" selon l'énoncé...)


    Le 2ème type d'approche ferait de cette fonction une fonction relativement délicate à appeler du point de vue sécurité, un peu comme strcpy à laquelle on préfère strncpy voire strncpy_s si on est en C11.

    Les deux choix sont possibles, mais le premier est un peu une approche tout en un, gérant effectivement dynamiquement l'espace nécessaire au plus juste (le realloc peut agrandir, comme diminuer l'espace), et me semble d'avantage correspondre à l'esprit de la question portant sur des "tableaux dynamiques", avec la seule contrainte que la mémoire pointée par M doit être allouée au préalable avec malloc, tout en laissant la fonction appelante gérer l'affectation initiale et la libération finale de la mémoire.

    Voilà, en explication plus longue, pourquoi je parlais de realloc

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 2
    Dernier message: 18/10/2003, 14h42
  3. Chaînes de caractères
    Par Zazeglu dans le forum C
    Réponses: 3
    Dernier message: 28/08/2003, 16h20
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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