Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec une chaine de caractere !

rien :P

Sujet résolu
    12 avril 2006 à 15:19:34

    Salut,

    J'essaie de mentrainer a utiliser les chaines de caractère mais jobtiens un malfonctionnement, c'est a dire que avec le code source suivant quand jentre une chaine de caractère (grace a scanf) avec plusieurs mots chacun espacé d'un espace et puis que je laffiche avec printf ca ne maffiche que le premier mots et pas les suivants.

    Exemple : J'entre "ta mere en string de guerre" et le printf maffiche "ta" (seulement le premier mots en clair)

    char chaine[100];

        printf("Entrez une chaine de caracteres : ");
        scanf("%s", prenom);
        printf("\nVoici la chaine que vous avez entree : %s", chaine);


    Petetre que l'on ne peut pas afficher d'espace, nan?

    AIdez moi plz ! [J'utilise win xp et code::blocks et jai bien inclue la librairie "string.h"]

    • Partager sur Facebook
    • Partager sur Twitter
      12 avril 2006 à 15:28:46

      Le délimiteur dans un scanf est l'espace, donc dès que scanf rencontre un espace il stoppe et renvoie la ligne qu'il a lu avant l'espace.

      Si tu veux qu'il lise jusqu'à un saut à la ligne à la place d'un espace, tu dois utiliser la fonction gets qui s'utilise comme ceci

      char chaine[100];
      gets(chaine);
      printf("\nVoici la chaine que vous avez entree : %s", chaine);


      Il y a également fgets, mais pour lui, tu dois indiquer le flux sur lequel lire et la longueur max qu'il peut prendre.

      fgets(char* chaine, int longueurMax, FILE* flux);

      fgets s'arrête s'il rencontre un saut à la ligne ou si la longueur max est dépassée

      Le même code avec fgets:
      char chaine[100];
      fgets(chaine, 100, stdin);
      printf("\nVoici la chaine que vous avez entree : %s", chaine);
      • Partager sur Facebook
      • Partager sur Twitter
        12 avril 2006 à 15:33:17

        Sinon tu peux utiliser scanf normal en mettant

        scanf ("%[^\n]s", titre);
        • Partager sur Facebook
        • Partager sur Twitter
          12 avril 2006 à 15:40:30

          Merci beaucoup a vous deux, ca fait plaisir de savoir que l'on peut compter sur les memebres du sdz pour nous aidez !

          Mon probleme est résolu !
          • Partager sur Facebook
          • Partager sur Twitter
            12 avril 2006 à 15:59:04

            Non ! fgets, pas gets.

            Aucune sécurité avec gets, idem que pour strcpy (la remplacer par strncpy).

            [e:]
            De plus fgets et gets ne sont pas équivalente : gets supprime le '\n', pas fgets, qui omet elle le caractère final '\0' si la saisie est trop longue. (cf post suivant de -ed-)

            Corrigé donc, soit un code ' sécurisé ' :

            #define SIZE_S 100

                char chaine[SIZE_S + 1];

                fgets(chaine, SIZE_S, stdin);

                if (chaine == NULL || strchr(chaine, '\0') == NULL)
                    exit(EXIT_FAILURE);

            [\e]

            ++.
            • Partager sur Facebook
            • Partager sur Twitter
              12 avril 2006 à 16:15:12

              <citation nom="mleg"idem que pour strcpy, la remplacer par strncpy. Prototype :
              char *strncpy(char *s1, const char *s2, size_t n); </citation>
              Attention avec strncpy().
              Il y a d'autres pièges. Notamment si la chaine sature, il n'y a pas de 0 final... et ce n'est donc plus une chaine valide...

              Je préfère une utilisation intelligente de strncat(). Mais là aussi, bien lire la doc.

              Sinon, dans la série 'je recode les fonctions de chaine', se fabriquer une vrai fonction de copie simple et sécuritaire ne serait pas du luxe. J'en ai une ici...

              http://mapage.noos.fr/emdel/clib.htm
              Module STR
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !

              Probleme avec une chaine de caractere !

              × 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