Bonjour à vous tous!
S'il vous plaît, je me demandais si on voulait faire une fonction void concat(mot 1,mot 2,mot 3) sans utiliser la bibliothèque string au fait le type mot est un tableau de caractère
à quoi cela va ressembler ?
Merci![]()
Bonjour à vous tous!
S'il vous plaît, je me demandais si on voulait faire une fonction void concat(mot 1,mot 2,mot 3) sans utiliser la bibliothèque string au fait le type mot est un tableau de caractère
à quoi cela va ressembler ?
Merci![]()
Bonjour,
Tu va devoir faire un malloc ou realloc pour ta chaîne destinatrice.
Ensuite, il s'agira de faire deux copies consécutives :
Information :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 char * resultat; char * source1; char * source2; //allocation de resultat while( *resultat++ = *source1++ ); //implémentation possible de strcpy. resultat--; // on va réécrire sur le '\0' final while(*resultat++ = *source2++ );
- l'opérateur = renvoie la valeur deux deuxième opérande (ici *source1++ et *source2++ ;
- l'opérateur ++ postfixe ( source1++) enregistre la valeur de la variable, l'incrémente puis retourne la valeur enregistrée ie source1++ retourne l'ancienne valeur de source1;
- le caractère de fin de chaîne est '\0' qui est 0x00 et qui vaut false.
Après essaye de voir ce qu'il se passe avec un exemple simple pour comprendre comment cela fonctionne^^
Bonjour,
Juste pour préciser l'allocation comment tu peux la faire car après la méthode de Neckara est bien (peut être un peu compliqué pour une débutante... mais bon ya les explications avec).
Tu dois calculer le nombre de caractères de tes chaines à concaténer les additionner et rajouter 1 pour le '\0'.
Si tu n'as pas le droit au bibliothèque de string ça ressemblera à ça :
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 int i = 0; int size = 0; while (source1[i] != '\0') i++; size = i; i = 0; while (source2[i] != '\0') i++; size = size + i + 1; //le "+ 1" est pour le caractère '\0' // Voila t'as ton bon nombre de caractères à malloc.
Neckara, DrDarko Merci <3
bonjour
Pour affecter une chaîne caractère par caractère à une chaîne vide j'utilise ca
après j'affiche le w[i];
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 i=0; w[i]==u[i]; i++;
qu'est ce qui ne vas pas
![]()
== sert à faire des comparaisons.
Pour faire des affectations, il faut utiliser =.
Neckara peux tu me guider ?
au fait si je veux optimiser un programme tel que le mien par exemple qu'est c je dois éviter ?
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 #include<stdio.h> #include<stdlib.h> #define N 10 typedef char mot[N+1]; void concat(mot u,mot v,mot w){ int i,j,k,size=0; while(u[i]!='\0'){ i++; size=i; i=size+1; while(v[j] && v[j]!='\0'){ u[i]=v[j]; i++; j++; k=0; i=0; while(w[k]){ w[k]=u[i]; k++; i++; }}}} main(){ int i; int size; mot u,v,w; printf("donner u :\n"); gets(u); printf("donner v :\n"); gets(v); concat(u,v,w); //printf("%s",w); //printf("v affecte a la fin de u est %s",u); getch(); }
Merci
je viens de remarqué une chose je pense que je n'ajoute pas à la fin plutot chaque emplacement de u je le remplace par celui de v
Ce bout de code :
n'a aucun sens.
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 while(u[i]!='\0'){ i++; size=i; i=size+1; while(v[j] && v[j]!='\0'){ u[i]=v[j]; i++; j++; k=0; i=0; while(w[k]){ w[k]=u[i]; k++; i++; }}}
Essayes de relire nos messages et de les comprendre.
Ensuite, pose nous des questions sur les lignes dont tu n'as pas très bien compris l'utilité ou le fonctionnement.
Après essaye de refaire ton code en séparant bien les étapes et en les commentant, exemple :
Ceci devrait t'aider à mieux comprendre ce que tu écris et pour nous de mieux comprendre ce que tu recherchais à faire.
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 void maFonction(int * tableau, int taille) { //j'initialise minimum avec le premier élément de tableau int minimum = tableau[0]; int position_minimum; //je parcours les éléments du tableau du deuxième au dernier pour trouver le minimum (le premier élément étant déjà dans minimum). for(int i = 1; i != taille, ++i) if( tableau[i] < minimum ) { minimum = tableau[i]; //des éléments 0 à i, tableau[i] est le minimum. position_minimum = i; //j'enregistre la position du minimum. } //je décale tous les éléments de 0 à position_minimum-1 "vers la droite" ie l'élément j se retrouvera à la position j+1. for(int i = position_minimum - 1 ; i != 0 ; --i) tableau[i + 1] = tableau[i]; //je décale un élément. //je met le minimum au début du tableau tableau[0] = minimum; }
à quoi sert cette ligne
et pour le calcul des tailles des deux chaînes source1 et source2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 resultat--;
est c que c'est pour savoir placer les chaîne lors de l'affectation de source2 à source1
Je copie l'intégralité de la source1 dans la chaîne destinatrice même le '\0' final.
Si je ne décrémente pas résultat, je vais copier l'intégralité de la source2 après le '\0' final. Or '\0' marque la fin des chaînes de caractères.
Le calcul des tailles sert à allouer ta chaîne destinatrice.
En effet, comment savoir si la chaîne destinatrice sera assez grande pour contenir la concaténation des deux chaînes sources ?
On ne va pas allouer un tableau de 4096 chars non seulement c'est du gaspillage de mémoire mais en plus on peut toujours avoir des chaînes sources trop grandes.
On va donc calculer la taille que doit faire la chaîne destinatrice pour allouer uniquement ce qu'il nous faut avec malloc (ne pas oublier le free à la fin).
le marqueur de la fin de la chaîne de caractère est pris en compte dans sa taille?
Oui, par exemple :
Équivaut à
Code : Sélectionner tout - Visualiser dans une fenêtre à part char c[] = "lapin";
Code : Sélectionner tout - Visualiser dans une fenêtre à part char c[6] = {'l', 'a', 'p', 'i', 'n', '\0'};
Partager