[C] concatenation char
Répondre à la discussion
Affichage des résultats 1 à 16 sur 16

[C] concatenation char



  1. #1
    karistote

    [C] concatenation char


    ------

    Bonjour,

    je me remet au C doucement (10 ans que je n'en ai plus fait)
    et je rencontre une galère :

    j'ai une chaine de type char * data.
    Ainsi, j'affiche sans problèmes un caractère :
    Code:
    printf("%c",data[i]);
    je souhaite concaténer ce caractère a une chaine
    de type char * out;
    J'ai beau eu tenter pas mal de choses
    (strcat, strcpy, sprintf, ...)

    a chaque fois je me retrouve avec un segmentation fault...

    Peut on m'expliquer svp ? Merci

    -----

  2. #2
    lou_ibmix_xi

    Re : [C] concatenation char

    difficile de te répondre sans voir comment sont allouées tes chaînes de caractères et comment tu les manipules, mais c'est bien str(n)cat qu'il faut utiliser pour ça.

  3. #3
    karistote

    Re : [C] concatenation char

    Merci pour ta réponse, je vais essayer d'éclaircir :

    la chaine data est un paquet udp que je recois, et dont
    je souhaite extraire une partie "texte".

    Code:
    char *decode_str(char *data , int size)
      {
        int i=0;
        char *out;
    
        for(i=3 ; i < size ; i++)
        {
           if(data[i]>=32 && data[i]<=128)
             {
               printf("%c",data[i]); // OK, cela affiche bien le caractère
               /* la question ici est comment concaténer ce caractère a "out" */
             }
        }
        return out; 
      }
    
    int main(void)
      {
        int s, i, slen = sizeof(si_other) , recv_len;
        char data[BUFLEN];
    
        recv_len = recvfrom(s, data, BUFLEN, 0, (struct sockaddr *) &si_other, &slen);
        char * reponse = decode_str(data, recv_len);
      }
    dans la fonction main, je souhaite récupérer les caractères de "data"
    (affichés par la fonction decode_str) dans la chaine "reponse".

    En espérant que cela soit plus clair

  4. #4
    Jack
    Modérateur

    Re : [C] concatenation char

    out n'est qu'un pointeur. Il te faut allouer dynamiquement la mémoire nécessaire à la chaine que tu veux construire => malloc

  5. A voir en vidéo sur Futura
  6. #5
    karistote

    Re : [C] concatenation char

    Oui je vois, et pour la concaténation ?

    Tu veux bien me faire un exemple ?
    J'avais essayé avec malloc, et je n'ai pas réussi...

  7. #6
    Jack
    Modérateur

    Re : [C] concatenation char

    Oui je vois, et pour la concaténation ?
    Comme cela te l'a été proposé par lou_ibmix_xi, il faut utiliser strcat ou mieux:strncat.

    J'avais essayé avec malloc, et je n'ai pas réussi...
    On peut voir?

  8. #7
    karistote

    Re : [C] concatenation char

    Hello

    Oui alors voici ce que j'ai essayé :

    Code:
    char *get_charsx(char *data , int size)
    {
        int i=0;
        char *out = (char *) malloc(BUFLEN);
    
        for(i=3 ; i < size ; i++)
        {
           if(data[i]>=32 && data[i]<=128)
             {
               printf("%c",data[i]);
             }
           else
             {
               printf("."); 
             }
        }
        strncat(out, data, strlen(data));
        return out;
    }
    La chaine (alphanumérique) s'affiche correctement,
    par contre dans "out" après appel de la fonction, je n'ai que 2 ou 3
    caractères bizarres et pas la chaine souhaitée que j'affiche...

    Une idée svp ?

  9. #8
    Jack
    Modérateur

    Re : [C] concatenation char

    Que vaut BUFLEN? Il faudrait réserver la taille nécessaire et suffisante: la chaine de départ + le caractère + le zéro terminal.

  10. #9
    Jack
    Modérateur

    Re : [C] concatenation char

    strncat concatène des chaines. <il faut donc que out et data en soient toutes les 2, c'est à dire qu'elles doivent être terminées par un 0.

    Pourrait-on avoir un exemple précis de ce que contient data au début, ce que doit valloir out à la fin et comment tu appelles la fonction (avec le calcul de la longueur) ?

  11. #10
    Chanur

    Re : [C] concatenation char

    Bonjour,

    De toutes façon, "strncat(out, data, strlen(data));" est faux : la mémoire allouée à "out" n'est pas initialisée.
    strncat va donc partir de l'adresse "out", avancer jusqu'à trouver un 0 et écrire à l'adresse obtenue, qui a toutes les chances d'être en dehors de la zone allouée.

    il suffit d'ajouter out[0]=0; après l'allocation pour résoudre ce problème.
    Dernière modification par Chanur ; 16/04/2016 à 21h28.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  12. #11
    Jack
    Modérateur

    Re : [C] concatenation char

    la mémoire allouée à "out" n'est pas initialisée
    C'est ce que je disais dans mon message précédent.

  13. #12
    Sawken

    Re : [C] concatenation char

    Bonjour karistote,

    C'est très simple, si tu veux pouvoir concatener ton char (data[i]) avec une chaine, il te faut connaitre:

    - La chaine de caractère que tu veux concatener (nous la nommerons "char *string")
    - Le caractère que tu veux concaténer (nous le nommerons "c")

    Maintenant que tu as ces deux paramètres il te faut créer une nouvelle chaine de caractère disons qu'elle se nomme "new_string",
    cette chaine devra être allouer de la taille de string + c (Ce qui donne taille de string + 1 si on réfléchit 30 secondes ^^)
    donc en code ça donne

    char *new_string; // On créer la nouvelle chaine qui va être remplie par "string" et "c"
    int i;

    i = strlen(string); // On dit que "i" est égal à la taille de string grâce à la fonction "strlen", donc si la variable "string" vaut "salut" alors i = 5 car salut contient 5 caractères
    [B]new_string = malloc((i + 2) * sizeof(char));
    [/B]/* On alloue notre nouvelle chaine grace à la fonction "malloc" et on rajoute le + 1 car on sait que l'on va concaténer notre "string" avec un seul caractère et on rajoute également un +1 pour le caractère de fin de chaine pour la cloturer, puis viens ensuite le "* sizeof(char)" qui veut juste dire qu'on veut plusieurs fois la taille d'un char et non pas plusieurs fois la taille d'un autre type (exemple: int) qui lui vaut 4, et vu que nous travaillons avec des "char *" et non pas avec des "int *" ça nous donnerait beaucoup d'espaces en trop, précisément 4 fois plus car un int vaut 4 octets. */

    Tu n'as plus qu'à faire ta propre boucle tout seul, en code ça donne ça:
    int i;

    i = 0;
    while (string[i] != '\0')
    [I]// Je parcours la chaine "string" et j'en copie chaque caractère dans "new_string";
    [/I]{
    new_string[i] = string[i];
    i = i + 1;
    }
    new_string[i] = c;
    // Je suis arrivé à la fin de la chaine "string" précisement au '\0', c'est à cet endroit que je veux copier mon caractère (ici "c")
    i++; // À la ligne précédente j'ai copié mon caractère donc il faut maintenant que j'avance d'une case pour y mettre le caractère de fin de chaine, le '\0'
    new_string[i] = '\0'; // Je rajoute le caractère de fin de chaine

    J'espère avoir fait au plus simple, si tu as des question je t'invite à venir en MP.

    PS: Quand tu as un "segmentation fault" cela veut dire que tu vas trop loin dans la mémoire et que cet endroit de la mémoire n'appartient pas à ton programme.
    Dernière modification par Sawken ; 17/04/2016 à 03h31.

  14. #13
    polo974

    Re : [C] concatenation char

    bon, sauf erreur, tu sautes les 3ers caractères puis tu vires ce qui n'est pas ascci affichable pour au final en faire une chaine affichable

    Code:
    char *decode_str(char *data , int size)
      {
        int i,j;
        char *out= (char *) malloc(BUFLEN);
    
        for(i=3, j=0; i < size ; i++)
        {
           if(data[i]>=32 && data[i]<=128)
             {
               printf("%c",data[i]); // OK, cela affiche bien le caractère
               /* la question ici est comment concaténer ce caractère a "out" */
               out[j] = data[i]; 
               j++;
             }
        }
        out[j]=0; // ferme la chaine de caractère
        return out; 
      }
    mais tu as alloué de la mémoire qu'il faudra un jour penser à rendre...

    autre façon de faire, si ton buffer data n'est pas utilisé par ailleurs :
    char *out= data;
    à la place du malloc, car ton résultat ici sera toujours plus court que tes datas initiales...

    edit: j'aurais fais un data[i]<128 (strictement inférieur), voire même < 127, car 127 = del...
    Dernière modification par polo974 ; 17/04/2016 à 10h36.
    Jusqu'ici tout va bien...

  15. #14
    Jack
    Modérateur

    Re : [C] concatenation char

    Bonjour sawken,

    là tu viens de priver karistote de la satisfaction de trouver la solution par lui-même, vu qu'il n'en était pas loin.

    J'espère avoir fait au plus simple, si tu as des question je t'invite à venir en MP.
    Alors là, c'est la négation du principe de fonctionnement d'un forum.

  16. #15
    Sawken

    Re : [C] concatenation char

    Bonjour Jack,

    Je suis vraiment désolé, ce n'était pas mon intention.

  17. #16
    Jack
    Modérateur

    Re : [C] concatenation char

    ok, pas de problème, vu que tu es nouveau ici et que ça partait d'un bon sentiment.

Discussions similaires

  1. Concaténation
    Par fabien024 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 03/11/2014, 10h40
  2. [C]-Conversion Int -> Char, Float -> Char, ...
    Par jorg1n dans le forum Électronique
    Réponses: 2
    Dernier message: 25/06/2008, 11h05
  3. dimensions et concaténation
    Par invitea767300d dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 24/11/2007, 15h55
  4. Concatenation
    Par invite2b4da655 dans le forum Électronique
    Réponses: 5
    Dernier message: 21/05/2006, 12h06