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.
A voir également:
- Exercice compliqué
- Transmath 3eme exercice ✓ - Forum Loisirs / Divertissements
- Cahier transmath 3° ex 6p37, 6et7p27 et 5p65 svp c'est urgent! ✓ - Forum Études / Formation High-Tech
- Le corrigé de cet exercice - Forum Programmation
- Exercice word gratuit avec corrigé ✓ - Forum Word
- Exercice algorithme bts cg ✓ - Forum Programmation
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
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;
}
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