[C] remplacer par des étoiles ou par rien...

remplacer par des étoiles ou par rien... [C] - C - Programmation

Marsh Posté le 12-12-2005 à 22:14:02    

je voudrais faire remplacer ce que la personne tape par rien ou des etoiles un peu comme sous linux les mots de passe....
 
j'étais partis sur les fonctions get() etc.. mais je n'arrive à rien  
 
voilà merci d'avance


---------------
signature du message
Reply

Marsh Posté le 12-12-2005 à 22:14:02   

Reply

Marsh Posté le 12-12-2005 à 22:15:59    

ps: vous affolez pas parceque là je vais dormir ... donc bonne nuit et puis merci d'avance ;) lol
 
EDIT:pour les mefiants je vais vraiment me coucher se n'est pas de l'ironie ....  
        (& tout sa pour un post...)


Message édité par magiclazy le 12-12-2005 à 22:17:07

---------------
signature du message
Reply

Marsh Posté le 12-12-2005 à 22:21:40    

magiclazy a écrit :

je voudrais faire remplacer ce que la personne tape par rien ou des etoiles un peu comme sous linux les mots de passe....
 
j'étais partis sur les fonctions get() etc.. mais je n'arrive à rien  


getpass(). C'est pas standard, mais on le trouve souvent. Sinon, faut le faire à la main. Comment ? Ca dépend de la plateforme...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 12-12-2005 à 22:59:24    

Sous Unix j'utilise la méthode de la désactivation de l'écho du terminal (man termios, fonction tcsetattr(), propriété ECHO).
C'est POSIX.1, et plutôt efficace (penser à rétablir le terminal quand on a fini [:petrus75] )
 
Pour les OS non-POSIX, je ne sais pas.


Message édité par Elmoricq le 12-12-2005 à 22:59:53
Reply

Marsh Posté le 12-12-2005 à 23:20:34    

Emmanuel Delahaye a écrit :

getpass(). C'est pas standard, mais on le trouve souvent. Sinon, faut le faire à la main. Comment ? Ca dépend de la plateforme...


 
y'a pas des feintes aux ncurses ?

Reply

Marsh Posté le 13-12-2005 à 13:19:48    

dsl elmoriq je suis debutant esce que tu peux me donner un exemple ?merci


---------------
signature du message
Reply

Marsh Posté le 13-12-2005 à 13:27:14    

jai regardé le man getpass() et c pas mal seulement dans certain man ils disent d'inclure  
 
unistd.h et d'autres
pwd.h
 
mais je ne l'ai trouve pas pour les telecharger merci d'avance


Message édité par magiclazy le 13-12-2005 à 13:38:00

---------------
signature du message
Reply

Marsh Posté le 13-12-2005 à 14:33:24    

Tu dois les avoir de base, ils font partie de la libc.
J'aurais même tendance à dire que si tu as le man, tu as la fonction.
 
Si tu disposes de getpass() sur ta machine (ce n'est pas mon cas), utilise cette fonction plutôt.  
Parce que la configuration des terminaux n'est pas triviale :
 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
 
int main(void)
{
    struct termios normal_term, pass_term;
    char password[250], *eol;
 
    /* Sauvegarde du terminal courant */
    if ( tcgetattr(STDOUT_FILENO, &normal_term) == -1 )
    {
        perror("Sauvegarde du terminal" );
        return EXIT_FAILURE;
    }
 
    /* Configuration du terminal sans ECHO */
    if ( ! memcpy(&pass_term, &normal_term, sizeof(struct termios)) )
    {
        fprintf(stderr, "Echec memcpy()" );
        return EXIT_FAILURE;
    }
    pass_term.c_lflag &= ~ECHO;  
    if ( tcsetattr(STDOUT_FILENO, TCSADRAIN, &pass_term) == -1 )
    {
        perror("Modification du terminal" );
        return EXIT_FAILURE;
    }
 
    /* Demande du mot de passe */
    printf("Mot de passe : " );
    fflush(stdout);  
 
    fgets(password, sizeof password, stdin);
    eol = strrchr(password, '\n');
    if ( eol )
        eol[0] = '\0';
   
    /* rétablissement du terminal */
    if ( tcsetattr(STDOUT_FILENO, TCSADRAIN, &normal_term) == -1 )
    {
        perror("Rétablissement du terminal" );
        return EXIT_FAILURE;
    }
 
    printf("\nLu : %s\n", password);
    return EXIT_SUCCESS;
}


(c'est du vite-fait)


Message édité par Elmoricq le 13-12-2005 à 14:33:52
Reply

Marsh Posté le 13-12-2005 à 16:44:41    

ha ok....
ben je crois je vais allé voir getpass() parcontre j'ai regardé quand j'utilise unistd.h j'ai une erreur de compilation et il mouvre unisdt.h
et me met en rouge cette ligne qui est d'ailleur la seul ...
 
#include "io.h"


---------------
signature du message
Reply

Marsh Posté le 13-12-2005 à 16:46:17    

par contre je voudrais dire je suis sous windows et dev c++
mais tu dis "je ne dispose pas de getpass()" c'est a dire ? on ne peut pas utiliser cette fonction sur certain machine ? meme si lon telecharge la le include qu'il faut ?


---------------
signature du message
Reply

Marsh Posté le 13-12-2005 à 16:46:17   

Reply

Marsh Posté le 13-12-2005 à 16:46:48    

Je ne peux pas t'aider, c'est dépendant de ton OS. Mais tu devrais avoir un fichier io.h qui traine dans /usr/include ou quelque part dans ton filesystem.
Si tu le trouves, vérifie que l'endroit où il se trouve est indiqué dans la variable d'environnement LD_LIBRARY_PATH

 
EDIT :

magiclazy a écrit :

par contre je voudrais dire je suis sous windows et dev c++


 
GRUMPF !
Tu aurais dû commencer par là.
Même la solution que je t'ai postée ne devrait pas fonctionner, vu qu'elle se base sur POSIX.1
Et c'est normal que tu n'aies pas de unistd.h (unistd = UNIx STanDard)


Message édité par Elmoricq le 13-12-2005 à 16:49:46
Reply

Marsh Posté le 13-12-2005 à 16:52:46    

ups dsl de ce coté la je connais pas encore tres biens les dependances à l'OS..


---------------
signature du message
Reply

Marsh Posté le 13-12-2005 à 16:54:58    

Ouais enfin Emmanuel a bien dit que ça dépendait des OS, et j'ai bien précisé que le coup du terminal c'était sous unixoïdes.
Alors quand tu m'as demandé un exemple, j'ai cru que tu étais sur un Linux ou autre...

Reply

Marsh Posté le 13-12-2005 à 16:57:31    

:sweat:  dsl  
 
sinon connais tu un moyen d'utiliser getpass() sous win XP et avec quel include parceque les man sur google sous contradictoires alors je sais pas vers ou morienter pour les recherche et les erreur que j'ai parceque sa se trouve ce n'est pas le bon include alors .. :cry:  
 
en tt cas merci


---------------
signature du message
Reply

Marsh Posté le 13-12-2005 à 17:04:42    

getpass() n'étant pas standard, s'il existe sur ton système, il faut le rechercher pour savoir dans quel en-tête il est défini.
Par définition, une fonction non-standard est propre à l'implémentation sur laquelle elle est présente. D'où les contradictions que tu trouves dans les manpages.
 
Maintenant rien ne dit que la libc que tu utilises inclu getpass().


Message édité par Elmoricq le 13-12-2005 à 17:05:17
Reply

Marsh Posté le 13-12-2005 à 17:46:03    

magiclazy a écrit :

par contre je voudrais dire je suis sous windows et dev c++
mais tu dis "je ne dispose pas de getpass()" c'est a dire ? on ne peut pas utiliser cette fonction sur certain machine ? meme si lon telecharge la le include qu'il faut ?


 
(Dev-C++)
Installer le devpack 'conio'


#include <conio2.h>
 
#include <string.h>
#include <stdio.h>
 
int main (void)
{
   char pwd[128];
 
   getpass ("Password", pwd);
   puts ("" );
 
   if (strcmp (pwd, "supercalifragilisticexpialidocious" ) == 0)
   {
      puts ("let's get in..." );
   }
   else
   {
      puts ("input error" );
   }
 
   return 0;
}


Attention, cependant, cette fonction est aussi dangereuse que gets()... (pas de contrôle de limite. Pour un mot de passe, c'est grave...)
 


Message édité par Emmanuel Delahaye le 13-12-2005 à 17:47:52

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-12-2005 à 10:08:15    

ok merci je fais sa  
 
pour linstant le site devpack ne marche pas donc je vais attendre un peu...
 
EDIT: Comment recherche dans quel en tête il pourrait etre ?

Message cité 1 fois
Message édité par magiclazy le 14-12-2005 à 10:09:54

---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 10:19:46    

il n'y aurait pas moyen d'avoir un comoilateur ayant un maximun de bibliothqe pour eviter ces problemes ?


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 10:46:01    

magiclazy a écrit :

pour linstant le site devpack ne marche pas donc je vais attendre un peu...


Je viens de faire mes mise à jours, aucun problème.

Citation :

EDIT: Comment recherche dans quel en tête il pourrait etre ?


grep ?  
 
Tu es bien conscient que ce qu'il y a dans un entête n'est que l'interface d'une bibliothèque. Le code d'implémentation se trouve dans le fichier de biblibliothèque lui-même (.a, .lib) qui doit être lié au projet...
 
http://mapage.noos.fr/emdel/notes.htm#bibliotheque


Message édité par Emmanuel Delahaye le 14-12-2005 à 10:46:35

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-12-2005 à 10:48:12    

magiclazy a écrit :

il n'y aurait pas moyen d'avoir un comoilateur ayant un maximun de bibliothqe pour eviter ces problemes ?


Dev-C++ (et Code::Blocks, mêmes devpaks) sont certainement les produits libres les plus ouverts qu'il soient dans le monde Windows.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-12-2005 à 11:19:26    

oki merci
 
 
[EDIT]: il n'y aurait pas un autre lien pour telecharger les packs parceque le site est inacessible  ::
 
 
"Error!
Can't connect to MySQL Server. Errorcode: P-Bø�stup pro u�ivatele 'devpaks4.devpaks'@'193.86.238.13' (s heslem ANO)".
 
 
Merci d'avance


Message édité par magiclazy le 14-12-2005 à 11:22:20

---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 11:27:46    

whouaaaaa  Code::Blocks est super je l'avais pas essayé trop cool  
bon ben maintenant je suis sous code::block
 
[EDIT] google ve pas me dire si on peut le mettre en francais smirffff


Message édité par magiclazy le 14-12-2005 à 11:32:17

---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 11:36:26    

Vu la qualité de certaines traductions, autant le laisser en anglais.
 
Et puis autant t'y habituer, à l'anglais, parce que tu vas en manger.

Reply

Marsh Posté le 14-12-2005 à 11:43:16    

.... effectivement ....
 
ps: pour code::blocks j'ai telecharger directement avec le updater/installer conio  
mais dans build message j'ai :
 
no new line at end of file
 
et dans  buil log :
 
Switching to target: default
Linking console executable: C:\Documents and Settings\be lazy  it's cool !\Bureau\langages\C\usvCB\projet.exe
.objs\main.o:main.c:(.text+0x45): undefined reference to `getpass'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 1 seconds)


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 11:46:26    

Pour le warning, "no new line at end of file", ce n'est normalement pas bloquant pour la suite.
Mais tu as cet avertissement parce que dans la norme, la dernière ligne de code d'un fichier source ou en-tête doit se terminer par une fin de ligne.  
Les compilateurs sont en général complaisants et se contentent de te signaler le problème, sans pour autant bloquer dessus. En tout cas les deux ou trois compilateurs que je connais.

Reply

Marsh Posté le 14-12-2005 à 11:49:44    

a oui effectivement j'ai juste a a sauter une ligne et cela n'apparait plus mais il ne s'execute pas alors sa doit venir du getpass() pourtant j'ai telecharger les librairies .. smirfff
 
 
[EDIT] il trouve bien conio2 mais il dit qui ni a pas de reference a getpass()

Message cité 1 fois
Message édité par magiclazy le 14-12-2005 à 12:00:04

---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 12:05:57    

magiclazy a écrit :

a oui effectivement j'ai juste a a sauter une ligne et cela n'apparait plus mais il ne s'execute pas alors sa doit venir du getpass() pourtant j'ai telecharger les librairies .. smirfff
 
 
[EDIT] il trouve bien conio2 mais il dit qui ni a pas de reference a getpass()


Comme signalé précédemment, cette fonction est dangereuse et a peut être été retirée de conio. Soit il existe une nouvelle version (autre nom, fouiller un peu conio.h), soit tu la fais toi même à coup de getch() / putch(). C'est pas trivial, mais c'est instructif...
 
Je conseille ce prototype:  

int my_getpass (char *s, size_t size);


Message édité par Emmanuel Delahaye le 14-12-2005 à 12:09:44

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-12-2005 à 12:07:53    

pour les getch et tout ji avais penser...  je crois que c ce que je vais faire par contre  
pour le proto j'y connais rien tu n'aurais un tuto ??
 
merci


Message édité par magiclazy le 14-12-2005 à 12:29:34

---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 12:10:56    

Reply

Marsh Posté le 14-12-2005 à 12:11:24    

[EDIT]avec unistd c pareil ....
 
 
j'ai foullé dans conio2 c'est bizarre il y fait notion de getpass() ....
 
 
 
 
**
 * Reads password. This function behaves like cgets.
 *
 * @see cgets
 * @param prompt prompt which will be displayed to user
 * @param str string for the password. <TT>str[0]</TT> have to contain
 * length of the <TT>str</TT> - 3
 * @returns <TT>&str[2]</TT>, the password will be stored in <TT>str</TT>
 * beginning at <TT>str[2]</TT>, in <TT>str[1]</TT> will be length of the
 * string without <TT>\\0</TT>, at <TT>str[2 + str[1]]</TT> will be \\0.
 */
char * getpass (const char * prompt, char * str);
 
/**
 * Makes foreground colors light.
 * If the current foreground color is less than <TT>DARKGRAY</TT> adds
 * 8 to the its value making dark colors light.
 * @see COLORS
 * @see lowvideo
 */


Message édité par magiclazy le 14-12-2005 à 12:12:03

---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 12:13:59    

unistd ......
 
 
/*
 * This file is part of the Mingw32 package.
 *
 * unistd.h maps (roughly) to io.h
 */
 
#ifndef _UNISTD_H
#define _UNISTD_H
 
#include <io.h>
#include <process.h>
 
#define __UNISTD_GETOPT__
#include <getopt.h>
#undef __UNISTD_GETOPT__
 
#ifdef __cplusplus
extern "C" {
#endif
 
/* This is defined as a real library function to allow autoconf
   to verify its existence. */
int ftruncate(int, off_t);
__CRT_INLINE int ftruncate(int __fd, off_t __length)
{
  return _chsize (__fd, __length);
}
 
#ifdef __cplusplus
}
#endif
 
#endif /* _UNISTD_H */


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 13:15:22    

rrrr je ne trouve pas de man sur putch()...


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 13:32:02    

magiclazy a écrit :

Switching to target: default
Linking console executable: C:\Documents and Settings\be lazy  it's cool !\Bureau\langages\C\usvCB\projet.exe
.objs\main.o:main.c:(.text+0x45): undefined reference to `getpass'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 1 seconds)


Normal, est-ce que tu as ajouté conio à ton projet (-lconio) comme je te l'avais déjà indiqué ?
 
http://forum.hardware.fr/hardwaref [...] m#t1266141


Message édité par Emmanuel Delahaye le 14-12-2005 à 13:34:22

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-12-2005 à 13:33:33    

oui oui ... justement c sa qui est bizarre ...


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 13:35:51    

magiclazy a écrit :

rrrr je ne trouve pas de man sur putch()...


Pas compliqué. Tu mets un caractère dans le paramètre et il sort à l'écran à la position courante du curseur.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-12-2005 à 13:38:59    

HAHA a ni rien comprendre j'ai redemarer le logiciel maintenant sa marche en presque le truc s'execute mais je ne comprends pas quel est le mot de passe a taper ? parceque j'ai tout essayer sa met tt le temps input error


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 13:41:40    

magiclazy a écrit :

HAHA a ni rien comprendre j'ai redemarer le logiciel maintenant sa marche en presque le truc s'execute mais je ne comprends pas quel est le mot de passe a taper ? parceque j'ai tout essayer sa met tt le temps input error


Montre ton code.
 
Si c'est l'exemple que j'avais donné, taper

supercalifragilisticexpialidocious


c'est un gag, évidemment. Jamais vu Mary Poppins dans ta jeunesse ?
 
http://en.wikipedia.org/wiki/Super [...] alidocious


Message édité par Emmanuel Delahaye le 14-12-2005 à 13:47:23

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 14-12-2005 à 13:44:23    

si... mais jai changé pour eviter les fautes j'ai mis ;) aa pour tester .. mais sa ne marche pas ..


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 13:45:38    

Code :
  1. #include <conio2.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. int main (void)
  5. {
  6.    char pwd[128];
  7.    getpass ("Password", pwd);
  8.    puts ("" );
  9.    if (strcmp (pwd, "aa" ) == 0)
  10.    {
  11.       puts ("let's get in..." );
  12.    }
  13.    else
  14.    {
  15.       puts ("input error" );
  16.    }
  17.    return 0;
  18. }


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 13:57:05    


 
Ok, j'avais pas testé mon code, désolé. En fait les données utiles commencent à tab+2. C'est sans doute dans la doc... Il doit y avoir des infos annexes (longueur, peut être...) dans les premiers bytes...  
 
http://conio.sourceforge.net/docs/ [...] 8h.html#a0
 
Ce genre de gag étatit courant dans certaines bibliothèques Borland (à l'origine de conio). Quand on s'écarte du standard, on arrive vite sur des terrains glissants...


   #include <conio2.h>
 
   #include <string.h>
   #include <stdio.h>
 
   int main (void)
   {
      char pwd[128];
 
      pwd[0] = sizeof pwd - 3;
      getpass ("Password: ", pwd);
 
      puts ("" );
 
#if 0
      printf ("'%s'\n", pwd + 2);
#endif
 
      if (strcmp (pwd + 2, "aa" ) == 0)
      {
         puts ("let's get in..." );
      }
      else
      {
         puts ("input error" );
      }
 
      return 0;
   }


Message édité par Emmanuel Delahaye le 14-12-2005 à 14:10:23

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed