Exercice compliqué

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 :
#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.

1 réponse

callfinger
 
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;
}
0
anthony
 
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
0