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 :

scanf("%s",ch);


Sujet :

C

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut scanf("%s",ch);
    Bonsoir

    On m'avait indiqué une fonction pour évité de débordement de scanf("%s",ch) en indiquant le nombre de caractères maximal pour la chaîne de caractères. Quelle est-elle ? Je n'arrive plus à la trouver
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut
    Je connais pas trop scanf, mais si c'est comme printf, ca doit être quelquechose comme

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gruik
    Salut
    Je connais pas trop scanf, mais si c'est comme printf, ca doit être quelquechose comme
    Attention, le 20 inclus le 0 final...

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    C'est bon à savoir

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par troumad
    On m'avait indiqué une fonction pour évité de débordement de scanf("%s",ch) en indiquant le nombre de caractères maximal pour la chaîne de caractères. Quelle est-elle ? Je n'arrive plus à la trouver
    fgets()

  6. #6
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 379
    Billets dans le blog
    1
    Par défaut
    Pour savoir comment utiliser scanf() de manière sécurisée, il y a un petit tutoriel ici

  7. #7
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    fgets()
    +1

  8. #8
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Je viens de tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "stdio.h"
     
    void main()
    {
     char CHN[20];
     
     scanf("%5s",CHN);
     printf("%s",CHN);
    }
    Ça marche
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    fgets... Pourquoi pas, mais je ne maîtrise pas le FILE * stream...
    Un exemple ?

    Tant de réponse pendant mon test !
    Merci
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  10. #10
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    je suggere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "stdio.h"
     
    int main()
    {
        char CHN[20];
     
        fgets(CHN, sizeof CHN, stdin);
        CHN[strlen(CHN) -1] = '\0'; /* Mais Emdel va te sortir sa super fonction clean() */
        fputs (CHN, stdout);
     
        return 0;
    }

  11. #11
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    fgets(b, sizeof b, stdin); ou fgets(b, sizeof b -1, stdin);

    nb : j'aurais mis des () à sizeof ? Ça me rassurait quant à la priorité des opérations !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  12. #12
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    The fgets() function reads at most one less than the number of characters specified by size from the given stream and stores them in the string str
    If any characters are read and there is no error, a `\0' character is appended to end the string
    Ca lit size - 1 caracteres afin de pouvoir mettre le '\0', donc pas besoin d'indiquer la taille -1

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gruik
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        fgets(CHN, sizeof CHN, stdin);
        CHN[strlen(CHN) -1] = '\0'; /* Mais Emdel va te sortir sa super fonction clean() */
    Oui, car le '\n' n'est pas forcément là. Il faut donc une action plus, disons, adaptative...
    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
    19
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n'); /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          /* purge */
          int c;
          while ((c = fgetc(fp)) != '\n' && c != EOF)
          {
          }
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        fgets(CHN, sizeof CHN, stdin);
        clean(CHN, stdin);

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par troumad
    fgets(b, sizeof b, stdin); ou fgets(b, sizeof b -1, stdin);
    T'es gentil avec tes petites questions, mais tu pourrais lire la doc...

    http://dpobel.free.fr/man/html/affic...969/man/fgets/

  15. #15
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    RTFM comme dirait l'autre

    Mais faut avouer que la construction de la phrase anglaise est pas tres simple si on connait pas bien l'anglais
    "The fgets() function reads at most one less than the number of characters specified by size"

    "at most one less than" C'est pas evident je trouve ^^

  16. #16
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    1) Je n'avais pas regardé la doc...
    2) Je suis plutôt anglophobe... Pas été assez sérieux de mon jeune temps

    Toutes les fautes sont de mon côté ! Mais j'avoue que man fgets donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           fgets() lit au plus size - 1 caractÚres depuis  stream  et  les  place
           dans  le  buffer  pointé par s.  La lecture s'arrête aprÚs EOF ou un
           retour-chariot. Si un retour-chariot (newline) est lu,  il  est  placé
           dans  le  buffer.  Un  caractÚre  nul  '\0' est placé à la fin de la
           ligne.
    Cette fois, je suis complètement dans le panneau ! Mais le coup du moins un, j'avoue que je n'avais pas du tout pensé que ça puisse exister ! Pour le man, je me suis arrété à FILE * stream qui est une notion que je ne connais pas car je n'en ai jamais eu besoin !

    Par contre, je ne comprends pas le purge du programme d'Emmanuel Delahaye! Surement parce que je n'ai pas étudié le stdin Pas besoin de répondre, mais je pense que plus de comentaires dans le code serait agréable.
    Pourquoi virer tous les caractères présents dans ce que j'appellerais par ignorance un tampon ! De ce côté, j'ai des choses à apprendre, mais malhereusement, jen'ai pas le temps !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par troumad
    Par contre, je ne comprends pas le purge du programme d'Emmanuel Delahaye! Surement parce que je n'ai pas étudié le stdin Pas besoin de répondre, mais je pense que plus de comentaires dans le code serait agréable.
    Pourquoi virer tous les caractères présents dans ce que j'appellerais par ignorance un tampon ! De ce côté, j'ai des choses à apprendre, mais malhereusement, jen'ai pas le temps !
    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    La purge est le choix le plus simple et le plus radical. Il y en a d'autres.

    Je te donnerais bien des exemples de code, mais tu risques d'être encore plus largué...

  18. #18
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Je prends note pour mettre dans ma préparation de cours, ce que j'ai déjà fait avec la remarque d'Anomaly.
    Citation Envoyé par Emmanuel Delahaye
    La purge est le choix le plus simple et le plus radical. Il y en a d'autres.

    Je te donnerais bien des exemples de code, mais tu risques d'être encore plus largué...
    J'ai fini il y a dix ans (et plus même : je prends de l'âge ) 3 ans de programmation intensive en C. Mon problème n'était absolument pas les I/O, mais la programmation de machines expérimentales avec X processeurs. Maintenant, je me suis proposé pour encadrer à partir de septembre un cours d'initialisation de C dans lequel je mettrais en remarque ce que j'apprends ici car c'est en dessus du niveau demandé, mais je me dois de le mettre.

    nb : je viens de mettre en ligne un programme (code source) que j'avais fait à cette époque sous Borland C qui tourne sous DOS avec gestion de la mémoire haute du PC et affichage couleur : http://troumad.info/C/courbes.zip
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  19. #19
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par troumad
    JJ'ai fini il y a dix ans (et plus même : je prends de l'âge ) 3 ans de programmation intensive en C.
    Pas de problèmes :

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module IO

  20. #20
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Bon... J'ai une mise à niveau à faire ! Même apprendre de nouvelles choses : je suis 100% autodidacte, mes profs ne connaissaient que le Pascal.

    je reconnais le principe des "petits programmes/grosses briques" que j'avais à l'époque où j'étais jeune. Ça accellérait pas mal la conception de nouveaux programmes !

    Merci
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

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

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