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
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
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) avecmovmem()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()
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]
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.
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]
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![]()
Partager