IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

concaténation cd chaine saisie au clavier


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut concaténation cd chaine saisie au clavier
    Bonjour,

    Je sais que ce sujet a déja été traité maintes et maintes fois, j'ai donc essayé toutes les solutions que j'ai pu lire sur le net, ou sur ce forum, mais rien toujours ma segmentation fault sur le strcat.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *cheminX, *chemin, *nomX;
     
    scanf("%s",&chemin); //pareil pour nomX
     
    memcpy(&cheminX,&chemin,sizeof(char *));
    strcat(cheminX,nomX);
    a l'aide d'un printf j'ai pu constater que le memcpy fonctionne sans probleme

    J'ai essayé en faisant un malloc mais dans ce cas la le memcpy de passe plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cheminX=malloc((strlen(chemin)+strlen(nomX)+1)*sizeof(char*));
    Peut-etre avec un calloc mais je ne sais pas l'utilisé, je vais me pencher sur la question maintenant, on s'est jamais...

    J'ai aussi lu cette solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(cheminX,"%s%s",chemin,nomX);
    Cette ne fonctionne ni avec un malloc ni sans.

    Voila je pense j'ai a peu près tout dis.
    Je m'en remets a vos lumières

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ouh la la, consulte d'urgence un cours sur les pointeurs en C
    Pratiquement tout ce que tu écris est incorrect en C (la syntaxe est correc te mais le programme plante ou a un comportement imprévisible).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    deja dans ton malloc au lieu de faire sizeof(char*) remplace par sizeof(char) qui en fait vaut 1octet donc inutile de le mettre a part pour prevenir une modif future . Car autrement tu demandes la taille d'un pointeur de caractere or ce n'est pas des pointeurs que tu veux stocker c'est des caracteres

  4. #4
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par juls64
    deja dans ton malloc au lieu de faire sizeof(char*) remplace par sizeof(char) qui en fait vaut 1octet donc inutile de le mettre a part pour prevenir une modif future . Car autrement tu demandes la taille d'un pointeur de caractere or ce n'est pas des pointeurs que tu veux stocker c'est des caracteres
    Oui j'avais testé mais ça ne marche pas non plus donc je pensais c'était comme ça ... donc je vais remettre vu que apparement c'est le reste qui est faux.


    Citation Envoyé par Trap D
    Ouh la la, consulte d'urgence un cours sur les pointeurs en C
    Bin le truc c'est que j'en ai eu des cours de C en DUT, mais franchement ya un fossé énorme entre ce qu'on t'apprends en cour et ce que tu dois faire après kan tu es au boulot.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    meme remarque pour memcpy le dernier parametre devrait etre strlen(src) je trouve bizarre que ca marche avec sizeof(char*) vu que la fonction attend un nombre d'octets à copier

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    petite remarque pour ton scanf avec &chaine tu veux passer l'adresse mais en fait quand tu declares *chaine chaine represente l'adresse donc pas besoin de mettre un & devant

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 948
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 948
    Points : 5 662
    Points
    5 662
    Par défaut
    Mye,
    Citation Envoyé par psylox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *cheminX, *chemin, *nomX;
     
    scanf("%s",&chemin); //pareil pour nomX
     
    memcpy(&cheminX,&chemin,sizeof(char *));
    strcat(cheminX,nomX);
    Bon, plus loin tu réserves de la mémoire pour cheminX, mais les autres ?

    Le scanf : comme chemin est déjà un pointeur, il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%s",chemin); //pareil pour nomX
    Pour memcpy, même remarque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy(cheminX,chemin,ici_la_bonne_taille_svp);
    Rarement vu tant d'erreurs en si peu de lignes

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Points : 65
    Points
    65
    Par défaut
    voici un code qui tourne
    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
     
     
     
    char *test;
    	char *test2;
    	char *concatene;
     
    	test =(char*) malloc(10);
    	test2 =(char*) malloc(10);
    	concatene =(char*) malloc(20);
    	scanf("%s",test);
    	scanf("%s",test2);
     
    	strcat(test,test2);
     
    	printf("test = %s\n",test);
    	memcpy(concatene,test,strlen(test) );
    	printf("concatene = %s\n",concatene);
    une petite remarque quand tu declares un pointeur l'adresse qu'il pointe n'est pas valide donc si tu essaies d'ecrire dedans tu as un seg fault donc utiliser un malloc permet de lui affecter un pointeur valide pour une taille donnée si tu t'amuses avec ce code d'ecrire plus de 10 caracteres une chance sur deux que ca plante et la chaine concatene a le meme resultat que test donc vaut eviter d'utiliser des variaboles qui ne servent a rien

  9. #9
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Citation Envoyé par droggo
    Rarement vu tant d'erreurs en si peu de lignes
    Merci je pensais appelé le livre des records

    Non j'ai rien dis c'est pathétique.

  10. #10
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    Plus j'avance et plus je recul ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    chemin=malloc(256*sizeof(char)); //pareil pour nomX
    if (chemin==NULL)
    { printf("Echec allocation mémoire !!!\n"); exit(EXIT_FAILURE);	}
    scanf("%s",&chemin);    //le & est obligatoire
     
    cheminX=malloc((strlen(chemin)+strlen(nomX)+1)*sizeof(char)); ...
    memcpy(cheminX,chemin,strlen(chemin));
    C'est mieux? pasque chez moi ça marche toujours pas ..

    (o faites merci de votre aide )

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par psylox
    Plus j'avance et plus je recul ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    chemin=malloc(256*sizeof(char)); //pareil pour nomX
    if (chemin==NULL)
    { printf("Echec allocation mémoire !!!\n"); exit(EXIT_FAILURE);	}
    scanf("%s",&chemin);    //le & est obligatoire
    Déjà c'est faux ici..

    Relis tes cours sur les pointeurs. On ne programme pas en faisant n'importe quoi..

    que prends la fonction scanf ? un pointeur.
    Qu'est-ce que chemin ? un pointeur
    Donc comment code-t-on scanf en voulant le résultat dans chemin ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char *chemin=NULL ;
    chemin = malloc ( 256);
    if ( chemin == NULL )
       return ERROR ;
    scanf("%s",chemin);
    Ensuite :

    Citation Envoyé par psylox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cheminX=malloc((strlen(chemin)+strlen(nomX)+1)*sizeof(char)); ...
    memcpy(cheminX,chemin,strlen(chemin));

    Si tu veux utiliser memcpy, ça peut marcher.

    Mais :
    1) il faut tester que l'allocation a marché
    2) le mieux serait strcpy/strcat, ou sprintf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cheminX=malloc((strlen(chemin)+strlen(nomX)+1)*sizeof(char));
    if ( cheminX == NULL )
      return ERROR ;
     
    strcpy ( cheminX, chemin);
    strcat ( cheminX, nomX);
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cheminX=malloc((strlen(chemin)+strlen(nomX)+1)*sizeof(char));
    if ( cheminX == NULL )
      return ERROR ;
     
    sprintf ( cheminX, "%s%s", chemin, nomX);
    Et enfin si tu veux mettre un séparateur entre les 2, ajouter un 1 à l'allocation...

  12. #12
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Points : 272
    Points
    272
    Par défaut
    C'est bon ça marche

    Citation Envoyé par souviron34
    1) il faut tester que l'allocation a marché
    Je le fais tout le tps meme si je le mettais pas dans les postes pour pas surcharger.

    Ok donc je retiens de pas mettre le & dans un scanf avec les char*


    Merci à vous tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déterminer le type de donnée d'une chaine saisie au clavier
    Par recome dans le forum Mathématiques
    Réponses: 2
    Dernier message: 15/01/2009, 22h47
  2. recuperer une chaine saisie en clavier
    Par salim81 dans le forum Langage
    Réponses: 1
    Dernier message: 07/09/2006, 10h31
  3. Concaténéation de chaine dans un group by
    Par Delphi-ne dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/01/2006, 00h11
  4. Parser une ligne saisie au clavier.
    Par Sylmandel dans le forum C++
    Réponses: 5
    Dernier message: 17/10/2005, 10h12
  5. Affichage d'une chaîne saisie au clavier
    Par Frenchghost dans le forum Assembleur
    Réponses: 17
    Dernier message: 29/12/2004, 13h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo