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 :

Comment lire l'entrée de longueur indéterminé au clavier ?


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 309
    Par défaut Comment lire l'entrée de longueur indéterminé au clavier ?
    Bonjour,

    pour lire au clavier je me sers de fgetc(stdin) dans une boucle.

    Mais lorsque je rencontre un '(' je dois lire la suite jusqu'au prochain ')' pour capturer l'intérieur car il sajit d'un argument sous la forme d'un double que je veux valider avec strod, mais comme je ne sais pas jusqu'a combien de caractères il peut y avoir jusqu'au prochain ) comment je dois stocker ça dans un char* ? En faisant une sorte de vecteur ?

    Avez-vous une solution à proposer ?

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ce que je fairais, c'est allouer une certaine taille de départ, par exemple, on peut prendre 20 char puis si dans ta boucle tu vois que tu arrives au vingtième, ti réalloues de la même taille. A la fin tu peux éventuellement refaire un realloc si tu veux que la taille de l'allocation soit de la même longueure de celle de ta chaîne (sans oublier bien entendu le zéro de fin )...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    comme dis precedement, tu lis jusqu'a arriver au bout, puis tu agrandis ton espace avec un realloc.
    cependant, j'aimerais apporter une precision: on ne double pas l'espace pour chaque agrandissement. explications ici: http://www.bourguet.org/realloc.pdf

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par Dark_Ebola
    [...] on ne double pas l'espace pour chaque agrandissement. explications ici: http://www.bourguet.org/realloc.pdf
    Tu diras ça à Emmanuel
    Citation Envoyé par [url=http://emmanuel-delahaye.developpez.com/clib/ed/src/farr.c]clib/ed/src/farr.c[/url]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
             /* grow by 2 */
             size_t const nb_elem = this->nb_elem * 2;
    #if !DBG_MEM
             size_t const size = this->elem_size * nb_elem;
             char *const arr = realloc (this->arr, size);
    Plus sérieusement : tu multiplies par quoi ? Par un float compris entre 1.001 et 1.618 ?

  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 David.Schris
    Tu diras ça à Emmanuel
    Plus sérieusement : tu multiplies par quoi ? Par un float compris entre 1.001 et 1.618 ?
    Bah, je ne suis pas contre le nombre d'or, mais dans un size_t, je le sens mal...
    2 est une valeur entière approché...

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par David.Schris
    Tu diras ça à Emmanuel
    Plus sérieusement : tu multiplies par quoi ? Par un float compris entre 1.001 et 1.618 ?
    Je multiplie par 1.5 et arrondi à l'entier le plus proche. Cette méthode me convient et me semble raisonnable...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par David.Schris
    Tu diras ça à Emmanuel
    Plus sérieusement : tu multiplies par quoi ? Par un float compris entre 1.001 et 1.618 ?
    1.5 ou 1.25; naturellement sans multiplication mais avec quelque chose comme: size += size/2 ou size += size/4. Je m'assure simplement que la valeur initiale de size est supérieure a 2 ou a 4. Je suis parfois plus subtil (1.5 puis 1.25 apres un seuil, arrondir size a une taille adequate -- multiple d'une page par exemple) mais c'est de l'ajustement en contexte.

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Dark_Ebola
    comme dis precedement, tu lis jusqu'a arriver au bout, puis tu agrandis ton espace avec un realloc.
    cependant, j'aimerais apporter une precision: on ne double pas l'espace pour chaque agrandissement. explications ici: http://www.bourguet.org/realloc.pdf
    Cette méthode est effectivement assez intéressante ... mais disons que je ne suis pas trop un matheux alors des fois une telle formule me donne un peu mal à la tête ... j'ai mes limites à ce niveau, jusqu'aux équations du seconde degré et éventuellement la combinatoire mais ca s'arrête là

    Mais je lirais bien un article un peu plus étoffé tout de même si cela existe, enfin si ca parle plus de programmation avec exemple que de formules de maths
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Franck.H
    Mais je lirais bien un article un peu plus étoffé tout de même si cela existe, enfin si ca parle plus de programmation avec exemple que de formules de maths
    L'exemple, j'en ai donne le coeur ci-dessus.

    L'idee, avec un facteur 2.

    Tu alloues 1
    Tu alloues 2 et tu liberes le 1.
    Tu alloues 4 (qui est plus que le 1 que tu as libere), et tu liberes les 2.
    Tu alloues 8 (qui est plus que les 3 que tu as libere) et tu liberes les 4.
    Tu alloues 16 (qui est plus que les 7 que tu as libere) et tu liberes les 8.
    On ne peut jamais reutiliser ce qui est libere.

    Tandis qu'avec un facteur 1.5.

    Tu alloues 2.
    Tu alloues 3 et tu liberes les 2.
    Tu alloues 4 (qui est plus que les 2 liberes) et tu liberes les 3.
    Tu alloues 6 (qui est plus que les 5 liberes) et tu liberes les 4.
    Tu alloues 9 (ce qui vaut les 9 liberes que tu peux reutiliser).

    Les maths, c'est pour determiner les seuils precis.

    Naturellement, savoir si la memoire liberee va reellement etre reutilisee, c'est une autre histoire. Ca depend de l'allocateur et des autres allocations faites.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Ok !! J'y vois déjà plus clair, merci
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    J'ai eu un projet, à une époque, où j'avais une fonction de comptage générant un facteur racine de 2.
    Inférieur au nombre d'or, et on retrouve ses bases toutes les deux allocations...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Comment lire une entrée clavier pour une variable StringBuffer ?
    Par Haktarus dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/06/2014, 15h19
  2. Réponses: 2
    Dernier message: 28/03/2008, 18h24
  3. Réponses: 2
    Dernier message: 06/12/2002, 07h50
  4. Réponses: 5
    Dernier message: 20/08/2002, 18h01

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