Partage
  • Partager sur Facebook
  • Partager sur Twitter

Chaine de caractère longueur incompréhensible

Sujet résolu
    26 août 2021 à 23:53:36

    Bonjour,

    je débute en C et je me suis mis à suivre une formation sur ce site. Un des TP de la formation demande la création d'un pendu. Cela s'est très bien passé, le pendu marche sauf quand le mot à trouver fait 5 caractères ou moins... Je me suis mis à faire mes recherches et j'ai trouvé la source du problème :

    char* generer(int len)
    {
        int i;
        char* motgen=malloc((len+1)*sizeof(char));
        printf("%ld",strlen(motgen));
        for (i=0; i<len; i++)
        {
            motgen[i]='*';
        }
        return motgen;
    }

    En effet, le printf m'informe que motgen (mot généré qui sera en fait le mot représenntant l'avancement du pendu) a une longueur de 6, alors que je veux absolument qu'il ait une longueur de 5 (j'utilise un strcmp avec le mot à trouver, qui lui fait 5 de longueur). J'ai essayé de changer le nombre d'octets alloués, mais cela ne change rien... Quelqu'un saurait-il me dire pourquoi ma chaîne a décidé de faire 6 de longueur ? Et surtout quelqu'un aurait-il une solution ?

    Merci d'avance ;)

    -
    Edité par Serial_Cookie 26 août 2021 à 23:54:54

    • Partager sur Facebook
    • Partager sur Twitter
      27 août 2021 à 2:48:55

      Deux choses:
      + tu fais le printf() avant d'avoir mis quelque chose dans ta chaîne. TTu ne dois pas présumer de ce qu'il y a dans l'espace retourné par malloc.
      En passant, la longueur réservée est correcte. Tu n'as pas besoin de sizeof(char). Ça vaut toujours 1.
      + Une chaîne doit se terminer par un caractère de fin de chaîne ('\0').
      Ici, il sera en position 6 (indice 5). C'est toi qui dois le placer.
      Ton strlen() sera correct seulement après cela.

      -
      Edité par PierrotLeFou 27 août 2021 à 2:55:10

      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        27 août 2021 à 8:51:30

        Merci beaucoup ! Après avoir adapté mon code grâce à tes conseils, tout marche parfaitement ! SUJET RESOLU
        • Partager sur Facebook
        • Partager sur Twitter
          27 août 2021 à 9:17:39

          Pour essayer de clarifier, en C il n'y a pas de type "chaîne de caractères" contrairement  aux autres langages de programmation plus évolués (à peu près tous les autres en fait).

          Certaines fonctions - par exemple printf avec le spécificateur %s -  considèrent comme chaîne de caractères un bout de la mémoire qui commence à une adresse donnée (le pointeur sur le début de la chaîne) ; le contenu de la chaîne s'arrête au premier octet rencontré.

          Par exemple si on déclare

          char tableau[] = { 'a', 'b', '\0', 'c', 'd'};
          


          on a défini un tableau de 5 octets qu'on peut voir comme une chaîne de longueur 2 (contenant 3 octets).

          si on affiche par  printf("%s", tableau);  ça affiche "ab".

          La chaîne est logée au début du tableau.

          Maintenant si on a char t[] = { 'x', 'y' };    et qu'on demande à afficher t de la même façon, ce qu'on va voir va dépendre des merdouilles qui traînent en mémoire derrière le tableau.  Ça va afficher aussi ce qui suit, jusqu'au prochain caractère nul.

          Donc quand on réserve un tableau par malloc() pour y mettre une chaîne, il faut penser à y loger le contenu de la chaîne ET le caractère nul qui marque la fin.

          -
          Edité par michelbillaud 27 août 2021 à 9:20:09

          • Partager sur Facebook
          • Partager sur Twitter

          Chaine de caractère longueur incompréhensible

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown