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 :

récupérer une chaine telle qu'elle est affichée


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut récupérer une chaine telle qu'elle est affichée
    bonjour,

    c'est un problème qui m'avait l'air tout simple comme ça mais en fait c'est une vraie galère. Je ne trouve pas la solution.

    En fait, lorsqu'on fait un (p_chaine est un char *, on a bien initialisé et tout et tout), si on saisit ensuite à l'écran (lettre par lettre): 'A','B',caractère effacement (<--),'B','A' ,on aura à l'écran: ABA (oui je sais il manque un B ).

    mais si on fait un il donnera 5 car la chaine a bien 5 caractères et c'est juste l'interprétation dans stdout qui affiche 3 caractères à l'écran. logique me direz vous...

    mais ce que je veux récupérer dans ce cas c'est ABA et seulement 'A','B','A' (avec strlen égal à 3).


    mon problème est qu'en pro*c, je passe en paramètre une chaine saisie précédemment à l'écran à une requête.
    Si l'utilisateur rentre ABA de la façon précédente, le paramètre sera la chaine 'A','B',effacement,'B','A' et pas 'A','B','A'. Si la requête est réussi à ramener quelque chose pour 'A','B','A', elle ramera autre chose et probablement rien pour 'A','B',effacement,'B','A'. Et l'utilisateur voyant la bonne chaine à l'écran (sans jeu de mots) se demandera bien pourquoi ça marche po!!!

    merci d'avance.

    PS: je précise que je suis sous HP-UX et que je n'ai à disposition que les librairies standards sous ce système.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par canibool Voir le message
    c'est un problème qui m'avait l'air tout simple comme ça mais en fait c'est une vraie galère. Je ne trouve pas la solution.

    En fait, lorqu'on fait un gets(p_chaine)
    Déjà , gets() , je le sens mal... C'est une fonction interdite pour les développements nouveaux...

    (p_chaine est un char *, on a bien initialisé et tout et tout), si on saisit ensuite à l'écran (lettre par lettre): 'A','B',caractère effacement (<--),'B','A' ,on aura à l'écran: ABA (oui je sais il manque un B ).
    Oui, la correction est gérée par le système (comme l'echo). Le C n'y peut rien du tout.


    mais si on fait un strlen(p_chaine) il donnera 5 car la chaine a bien 5 caractères
    Non pas du tout. La chaine qui résulte de la saisie ne tient absolument pas compte des caractères erronée et des caractères de correction. On a que le résutat qui est ici 3. Fait la vérification. (ou alors, ce n'est pas gets() que tu utilises ...)

    et c'est juste l'interprétation dans stdout qui affiche 3 caractères à l'écran. logique me direz vous...

    mais ce que je veux récupérer dans ce cas c'est ABA et seulement 'A','B','A' (avec strlen égal à 3).
    C'est le cas. Montre ton code.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut code
    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
    20
    21
    22
    23
    24
     
      int  i ;
      char initials[15] ;
      char *pinitials ;
      /* */
      pinitials         = &initials[0] ;
      /* */
      for (i=0;i<=3;i++) 
      {
        if (i == 3)
        {
         sql_error ("\n3 attempts, you will be disconnected") ;
         exit(-1) ;
        }
        /* */
        fflush(stdin) ; /*je sais c'est pas standard, mais je verrai ça plus tard*/
        if (debug==0) system("clear") ;
        /* */
        printf("\n Initials : ") ;
        gets(pinitials);
        printf("leninit:|%d|\n",strlen(pinitials)) ;
        printf("init:|%s|\n",pinitials) ;
     
    etc...
    vous voyez c'est un code tout con.

    pour une entrée de 'A','B',effacement,effacement,'A','B'. j'ai bien strlen qui donne 6.

    j'ajoute que j'ai essayé avec à la place de gets et ça donne la même chose.

  4. #4
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    C'est quoi ton stdin là?

    Explique comment tu lances le programme.
    Si il y a une indirection de fichier, ça expliquerais pourquoi les caractères d'effacement passent au programme. Autrement la chaîne de caractère serait transmise au programme seulement quand tu appuies sur Entrée, et les caractères d'effacement non.

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    je ne te suis pas là.

    en fait si je fais 'A','B',effacement,effacement,'B','A' j'aurais BA et pas AB. le caractère d'effacement n'envoie pas la chaine au programme. c'est seulement ENTREE qui fait cela (le chr(10) en fait).

    non il n'y a absolument pas de redirection quelconque ou de travail avec des fichiers. Ce programme affiche des invites, récupère des données saisies à l'écran et communique avec une base de donnée à la manière du pro*c.

    le soucis est que initials contient bien 'A','B',effacement,effacement,'B','A' mais évidemment quand on fait un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s\n",pinitials)
    on voit BA.

    la preuve:

    en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     for(j=0;j<strlen(pinitials);j++){
        printf("|%c|\n",initials[j]) ;
        }
    juste après le gets, j'obtiens:
    |a|
    |b|
    |
    |
    |b|
    |a|

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce comportement n'est pas standard.

    Normalement, l'entrée standard intercepte le caractère d'effacement, qui n'est pas envoyé au programme.
    Quelle est ta plate-forme ?
    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.

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    c'est dis dans mon premier post: HP-UX...HP Tru64 UNIX V5.1B pour être exact.

    étonnant que ce ne soit pas standard sur cette plateforme.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    HP-UX 5 ?
    Il est si vieux qu'il n'apparait même pas dans l'historique sur Wikipédia!

    Donc au contraire, ce n'est pas étonnant du tout qu'il ne soit pas standard... souviron34 a connu des HP-UX qui crashaient sur un free(NULL)...
    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.

  9. #9
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    HP-UX 5 ?
    Il est si vieux qu'il n'apparait même pas dans l'historique sur Wikipédia!
    Non, c'est HP-UX Tru64 base sur System V. Voir ici.

    Pour le probleme de canibool, je pense que le terminal est en mode raw, donc aucun caractere n'est interprete.

  10. #10
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Si ça vient de ce UNIX (c'est assez répandu comme OS sur les gros HP cela dit), je verrai ça rapidement car ça va migrer sous solaris bientôt.

    D'autres idées à part ça?

    Au pire je vais essayer sur mon ubuntu chez ouam et là j'en aurais le coeur net.

  11. #11
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    mmmh... mode raw? ça peut se corriger avec une structure termios ça?

  12. #12
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Citation Envoyé par canibool Voir le message
    je ne te suis pas là.

    en fait si je fais 'A','B',effacement,effacement,'B','A' j'aurais BA et pas AB. le caractère d'effacement n'envoie pas la chaine au programme. c'est seulement ENTREE qui fait cela (le chr(10) en fait).
    Normalement, jusqu'a ce que tu appuies sur entree tu es en mode d'edition de ligne, et le caractere d'effacement n'est pas enregistre. Essaie d'utiliser bash ou zsh comme invite de commande, tu verras.

    Quel est le resultat de:
    ?

  13. #13
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    excuse moi mais c'est du kornshell (ksh). le bash n'existe pas sur ce système. Csh et Tcsh je crois que non égelement mais il faut que je vérifie.

  14. #14
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    pour être clair, je pense que ça n'a rien à voir étant donné que le ksh est le shell le plus courant sur les systèmes UNIX.

  15. #15
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Tu as peut-être bien raison. Une autre idée, sûrement que la touche d'effacement n'est pas bien interprétée. Essaie:

    http://www.seismo.ethz.ch/linux/backspace.html


  16. #16
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    @bredelet:
    bien joué pour avoir trouvé cette info mais ce n'est pas ça. dans ta doc il s'agit de système ou la caractère d'effacement (backspace) ne fait pas sont taf: il efface pas le caractère précédent. là c'est pas mon cas. il fait très bien son travail... il fait même du zèle! j'arrive pas à m'en débarrasser!

    merci quand même.

  17. #17
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    par rapport à la suggestion du mode raw(), j'ai essayé de faire un cbreak() avant le gets(char *) (curses.h). j'ai la librairie dans /usr/include et j'ai fait le #include. mais je me fais jeter à la compilation=> il connait pas cbreak(). je vais essayer de creuser un peu par là.

    y'aurait-il un moyen de changer le mode raw/cbreak avec termios.h?

  18. #18
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 15
    Points : 6
    Points
    6
    Par défaut résolution partielle mais suffisante
    j'ai dit que je migrais vers solaris. ben dessus ça marche. donc plus de soucis. j'ai par ailleurs essayé de faire un cbreak() car l'un d'entre vous me suggérait que mon terminal est en mode raw. c'est très certainement le cas mais cbreak() n'est pas reconnue par le compilateur malgré l'include de curses.h. tant pis... de toute façon le problème c'est réglé un peu tout seul.

    merci à tous.

  19. #19
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par canibool Voir le message
    de toute façon le problème c'est réglé un peu tout seul.
    merci à tous.
    Oui, mais tu n'en as pas encore clairement identifié la cause et, par conséquent, tu ne peux pas garantir que le problème ne se représentera pas.

    Disposes-tu de stty, histoire de visualiser et modifier les flags de ton terminal depuis la ligne de commande avant de demander à ton programme C de le faire explicitement ?

  20. #20
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    HP-UX 5 ?
    Il est si vieux qu'il n'apparait même pas dans l'historique sur Wikipédia!

    Donc au contraire, ce n'est pas étonnant du tout qu'il ne soit pas standard... souviron34 a connu des HP-UX qui crashaient sur un free(NULL)...
    HPUX 10.4 et quelque, ce me semble.. Il y a environ 12 ans
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/02/2010, 04h44
  2. Réponses: 14
    Dernier message: 05/05/2008, 15h35
  3. Réponses: 5
    Dernier message: 22/06/2006, 17h19
  4. Récupérer une chaine de caractère dans une page
    Par BrunS dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2005, 14h28
  5. [IO]Récupérer une chaine texte dans un flux HTTP
    Par elitost dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 16/03/2005, 10h39

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