Exercice compliqué
anthony
-
anthony -
anthony -
Bonjour,
Dans mon livre de programmation je galère sur un exercice, voici l'énoncé.
Ecrivez un fonction qui lit 2 chaînes. Utilisez la fonction malloc() pour allouer la mémoire
nécessaire au stockage des deux chaînes concaténées.
Renvoyez le pointeur de la nouvelle chaîne.
voici un le code :
en faite voila le plan que j'ai essayé de suivre :
1 - Calcul de la taille de la chaine concatene (donc calcul de la taille des 2 chaines)
2 - On cree cette chaine avec malloc en rajoutant + 1 pour le '\0'
3 - Tu remplis cette nouvelle chaine avec deux boucles chacune parcourant les deux arguments.
Dans mon livre de programmation je galère sur un exercice, voici l'énoncé.
Ecrivez un fonction qui lit 2 chaînes. Utilisez la fonction malloc() pour allouer la mémoire
nécessaire au stockage des deux chaînes concaténées.
Renvoyez le pointeur de la nouvelle chaîne.
voici un le code :
#include <stdio.h>
#include <stdlib.h>
int nbreCaractere(char* chaine1, char* chaine2);
int main()
{
/* chaine */
char* a = "SALUT";
char* b = "Anthony";
char *p, i;
int donnees;
donnees = nbreCaractere(a, b); /* appel de fonction */
/* allocation */
p = malloc(sizeof(*p) * donnees);
if(p == NULL)
{
puts("Pas assez de memoire");
exit(0);
}
/* boucle pour remplir la chaine */
for(i = 0; i != donnees; i++)
p[i] = a[i];
for(i = 0; i != donnees; i++)
p[i] = b[i];
/* affichage des chaînes */
printf("%s", p);
return 0;
}
int nbreCaractere(char* chaine1, char* chaine2)
{
int nbre_caracteres_chaine1, nbre_caracteres_chaine2, i = 0, x = 0;
char* pchaine;
/* boucle qui compte le nombre de caractère */
do
{
nbre_caracteres_chaine1 = chaine1[i];
i++;
}while(nbre_caracteres_chaine1 != '\0');
i--; /* on enlève 1 car c'est l'équivalant de '\0' */
/* idem */
do
{
nbre_caracteres_chaine2 = chaine2[x];
x++;
}while(nbre_caracteres_chaine2 != '\0');
x--; /*idem */
return (i + x + 1); /* +1 pour '\0' */
}
en faite voila le plan que j'ai essayé de suivre :
1 - Calcul de la taille de la chaine concatene (donc calcul de la taille des 2 chaines)
2 - On cree cette chaine avec malloc en rajoutant + 1 pour le '\0'
3 - Tu remplis cette nouvelle chaine avec deux boucles chacune parcourant les deux arguments.
Configuration: Windows 7 Firefox 3.5.6
1 réponse
-
il ya des erreurs sur ton code:
dans le main(dans la deuxieme bouble):
tu ecrase dans p les i premiers caractere provenant de la chaine a par les i premier car de b;
si tu ne doit pas utiliser les fonctions de lib standard( strlen et compagnie) ecrie une fonction qui permet de calculer la taille d'une chaine de car que tu pourra eventuellement reutiliser par la suite pour d'otre cas#include <stdio.h> #include <stdlib.h> int mystrlen(const char *string){ int cpt = 0; for(int i = 0; string[i] != '\0'; ++i) cpt++; return cpt; } int main(int argc, char **argv){ // on passe les parametres // directement en ligne de commande if(argc != 3){ // on verifie kon a exactement 3 parametres sur // l'invite de commande( le nom de l'executable et // les deux chaines de caractere si telle n'est pas // le cas on previent l'utilisateur et on interomp le prog fprintf(stderr,"usage: %s chaine_dest chaine_src\n",argv[0]); exit(EXIT_FAILURE); } char *a = argv[1]; char *b = argv[2]; char *tmp ; int taille_a = mystrlen(a); // on calcul la taille de a sans le int taille_b = mystrlen(b); // idem int taille = taille_a + taille_b; // on les sommes tmp = malloc(sizeof(char)*taille); // on alloue la memoire pour tmp; // on aurai pu decider de // modifier par exple la chaine // de cette facon: on ajoute a la // chaine a la chaine b en // reallouant de la memoire pour // a pour recevoir b; essaye de // le faire... int i; for( i = 0; i < taille_a; ++i) // on parcour a et on le recopie // dans tmp tmp[i] = a[i]; for( i = 0; i < taille_b; ++i) // on recopie b dans tmp a partir de // la ou on sest arrete precedement tmp[i + taille_a]= b[i]; tmp[taille] = '\0'; // on ecrit notre fin de chaine printf("[chaine1 = %s] + [chaine_2 = %s ] = [ %s ]\n ",a,b,tmp); // free(tmp); // on libere la memoire alloue return EXIT_SUCCESS; }-
ben c'est ce que j'ai fais le fonction nbreCaractere calcul la longueur des 2 chaînes et les renvoient.
tu ecrase dans p les i premiers caractere provenant de la chaine a par les i premier car de b;
Dans ce code:for(i = 0; i != donnees; i++) p[i] = a[i]; for(i = 0; i != donnees; i++) p[i] = b[i];
La seule erreur que je vois dans ce code est dans la condition tant que i est differrent de donnees alors elle va continuer, alors que donnees est la valeur de la longueur des 2 chaînes donc en gros elle va stocker la chaine a dans p mais après l'avoir stocker elle va continuer puisque la chaine a est different de donnees.
J'ai essayer de mettre ca:for(i = 0; i != (a-1); i++)/* -1 en enleve '\0' */ p[i] = a[i]; for(i = 0; i != (b-1); i++)/*idem*/ p[i] = b[i];
içi je compare i a la chaine a - la valeur '\0' mais sa plante dans mon programme
-