Fonction qui insert un mot dans un autre
Résolu
Bonjour,
On nous demande d'écrire une fonction
J'arrive pas à le faire mais voilà mon code :
EDIT: coloration syntaxique + indentation
On nous demande d'écrire une fonction
strinsert(char * M, char * T, int i)qui insert un mot
Tdans
Mà la position
ien utilisant un tableau dynamique et les fonctions de
<string.h>.
J'arrive pas à le faire mais voilà mon code :
void strinsert(char *M, char *T, int i) { if (strlen(M) <= strlen(T)) { ModifierCapacite(M,T); } for (int j = strlen(M) - 1; j>0; j--) { M[j + 2] = M[j] ; } for (int j = i - 1 ; j <= strlen(T) ; j++) { strcpy(M[j], T[j - 1]); } printf("final copied string %s", M); } void ModifierCapacite(char * M, char * T) { char * tmp; if (!tmp) { exit(EXIT_FAILLURE); } tmp = (char *) malloc(strlen(M) * sizeof(char)); strcpy(tmp, M); free(M); M = (char *) malloc((strlen(M) + strlen(T)) * sizeof(char)); strcpy(M, tmp); }
EDIT: coloration syntaxique + indentation
Configuration: Android / Chrome 70.0.3538.80
A voir également:
- Fonction qui insert un mot dans un autre
- Fonction si et - Guide
- Trousseau mot de passe iphone - Guide
- Touche insert - Guide
- Mettre un mot de passe sur un dossier - Guide
- Comment remplacer un mot par un autre dans word - Guide
1 réponse
Bonjour,
Conseils préliminaires
- indente ton code (cf message corrigé) ça t'aidera à ne pas oublier d'accolade (j'en ai rajouté)
- utilise les balises de code
- fournit un code compilable et exécutable (avec une fonction main, les #include qui vont bien, etc)
- n'écrit pas ton programme en un coup : rajoute progressivement des instructions, compile, teste, et si c'est bon, continue à le faire grossir. Ici par exemple ton strinsert appelle la fonction
- le C suit des conventions de notations. Par exemple le nom d'une fonction s'écrit généralement tout en minuscule avec des _ (par exemple
- toujours dans les notations, un nom de variable en capitale désigne normalement une constante (ce qui n'est pas le cas de ton
- choisis des noms de variables parlants (M et T, bof bof). Une chaine par exemple s'appelle plutôt
- les pointeurs reçus en paramètre de fonctions et non modifiés par la fonction devraient être
Retour à ton problème
Dans ce qui suit je renomme
Première question : puis je réutiliser
Deuxième question : est-ce que je connais la taille de
Maintenant comment procéder :
- il faut recopier les
- à la suite de quoi il faut écrire
- à la suite de quoi il faut écrire la fin du mot
Pour appeler correctement ces fonctions, toute la difficulté réside dans :
- à partir de quel index je lis dans
- à quel endroit j'écris dans
Et une fois qu'on a réfléchi à tout ça on arrive à ce programme :
... qui donne :
Remarque :
Pour faire les choses bien, on devrait contrôler au début de
-
-
Remarque :
Pour plus de détails sur les fonctions utilisées, mettons
Une autre manière de faire
On aurait pu imaginer de :
-
- décaler le suffixe de
- et enfin recopier
Ainsi la chaîne
Tout dépend de ce qu'on veut faire. Dans le code que j'ai proposé,
Bonne chance
Conseils préliminaires
- indente ton code (cf message corrigé) ça t'aidera à ne pas oublier d'accolade (j'en ai rajouté)
- utilise les balises de code
- fournit un code compilable et exécutable (avec une fonction main, les #include qui vont bien, etc)
- n'écrit pas ton programme en un coup : rajoute progressivement des instructions, compile, teste, et si c'est bon, continue à le faire grossir. Ici par exemple ton strinsert appelle la fonction
ModifierCapacite... qui n'est pas encore déclarée (et qui était mal orthographié en plus dans ton message initial !)
- le C suit des conventions de notations. Par exemple le nom d'une fonction s'écrit généralement tout en minuscule avec des _ (par exemple
ma_fonction) et parfois
maFonction. Je préconise la première.
- toujours dans les notations, un nom de variable en capitale désigne normalement une constante (ce qui n'est pas le cas de ton
Mou de ton
T).
- choisis des noms de variables parlants (M et T, bof bof). Une chaine par exemple s'appelle plutôt
s.
- les pointeurs reçus en paramètre de fonctions et non modifiés par la fonction devraient être
const.
Retour à ton problème
Dans ce qui suit je renomme
Men
s_inputet
Ten
s_insert. J'appelle
s_outputla chaîne que tu veux construire.
Première question : puis je réutiliser
s_input? Non, car
s_outputest plus grande, donc on ne peut pas ajouter ce qui manque et décaler le suffixe. Il va donc falloir recontruire
s_outputà partir de
s_inputet
s_insert.
Deuxième question : est-ce que je connais la taille de
s_output? est-ce que je la connais à la compilation (de manière absolue, car c'est une constante), auquel cas une allocation statique est envisageable ; où à l'exécution (donc de manière dynamique, car ça dépend de ce qui se passe à l'exécution du programme) ? Ici la taille de
s_ouputégale la taille de
s_input+ la taille de
s_insert. Ça dépend de deux variables donc on doit faire une allocation dynamique (cf
malloc). Et qui dit
mallocdit
freesi le pointeur a été créé avec succès, comme ça on évite une fuite mémoire.
Maintenant comment procéder :
- il faut recopier les
ipremiers caractères de
s_inputdans s_output ; pour ça on va utiliser
strncpy,
- à la suite de quoi il faut écrire
s_insert; comme ici je vais tout écrire tout jusqu'à la fin de la chaîne je peux utiliser
strcpy,
- à la suite de quoi il faut écrire la fin du mot
s_input.
Pour appeler correctement ces fonctions, toute la difficulté réside dans :
- à partir de quel index je lis dans
s_input
- à quel endroit j'écris dans
s_output
Et une fois qu'on a réfléchi à tout ça on arrive à ce programme :
#include <stdio.h> #include <stdlib.h> #include <string.h> char * insert_str(const char * s_input, const char * s_insert, size_t i) { size_t len_input = strlen(s_input), len_insert = strlen(s_insert); char * s_output = malloc(len_input + len_insert + 1); if (s_output) { strncpy(s_output, s_input, i); strcpy (s_output + i, s_insert); strcpy (s_output + i + len_insert, s_input + i); } return s_output; } int main() { char * s_input = "Bonjour, ça va ?"; char * s_insert = " Joujou"; char * s_output = insert_str(s_input, s_insert, 7); if (s_output) { printf("s_output = [%s]\n", s_output); free(s_output); } else { fprintf(stderr, "erreur mémoire\n"); return 1; } return 0; }
... qui donne :
s_output = [Bonjour Joujou, ça va ?]
Remarque :
Pour faire les choses bien, on devrait contrôler au début de
insert_strque :
-
iest plus petit que
len_input. Pour cela tu peux utiliser la fonction
assert, fournie par
<assert.h>.
-
s_inputet
s_insertsont non
NULL.
char * insert_str(const char * s_input, const char * s_insert, size_t i) { assert(i < len_input); assert(s_input); assert(s_insert); //... }
Remarque :
Pour plus de détails sur les fonctions utilisées, mettons
strncpy, tape dans un terminal linux ou dans google
man strncpy.
Une autre manière de faire
On aurait pu imaginer de :
-
reallocla chaîne
s_inputpour augmenter la capacité du bloc mémoire associé,
- décaler le suffixe de
len_insertoctets vers la droite à l'aide de
memmoveou
strcpy,
- et enfin recopier
s_insertà l'endroit approprié (avec
strcpyou
memcpy).
Ainsi la chaîne
s_inputdevient
s_output(et doit du coup être passé en tant que
char *, puisqu'elle est modifiée).
Tout dépend de ce qu'on veut faire. Dans le code que j'ai proposé,
s_inputreste dans son état originel.
Bonne chance
A cette ligne, , tu as oublié d'ajouter à la quantité de mémoire demandée (donc ).
@Joujou98: cet ajout est nécessaire afin que l'espace mémoire soit suffisant pour accueillir la longueur des deux chaînes déterminée par et le caractère de fin de chaîne , qui n'est pas compté par .