PDA

View Full Version : Intercettare un input in c o c++


Gogeta ss4
02-06-2004, 14:59
Raga voglio fare un pgm che praticamente quando un utente preme un tasto sulla tastiera al posto di visualizzare il carattere o il numero inserito visualizzi un asterisco??
Un po come per le password
Grazie in anticipo

LukeHack
03-06-2004, 05:01
Originariamente inviato da Gogeta ss4
Raga voglio fare un pgm che praticamente quando un utente preme un tasto sulla tastiera al posto di visualizzare il carattere o il numero inserito visualizzi un asterisco??
Un po come per le password
Grazie in anticipo
ehm... mai sentito parlare di CEdit nelle MFC di microzozz?

se poi intendi da terminale, allora devi crearti un hook di sistema,ossia una dll che intercetti i tasti premuti e stampi gli *...soluzione,quest'ultima che se ti interessa posso postarti un pezzo di codice

ri
03-06-2004, 08:56
per la serie "viva la portabilità"...

se è un programma console basta fare


int c;
while((c = getch()) != 'Q') // premere Q per uscire
printf("*");

LukeHack
03-06-2004, 12:15
Originariamente inviato da ri
per la serie "viva la portabilità"...

se è un programma console basta fare


int c;
while((c = getch()) != 'Q') // premere Q per uscire
printf("*");

se la getch() non fa l'eco dei tasti (non ricordo) effettivamente è la soluzione migliore;)

ri
03-06-2004, 12:26
la getch non fa eco
la getche lo fa

Gogeta ss4
03-06-2004, 18:38
Originariamente inviato da ri
per la serie "viva la portabilità"...

se è un programma console basta fare


int c;
while((c = getch()) != 'Q') // premere Q per uscire
printf("*");



Sinceramente non ho capito bene
Perchè deve essere diverso da Q??

cionci
03-06-2004, 18:59
E' solo un esempio ;)

ri
03-06-2004, 19:42
in questo caso ho deciso che la condizione per terminare la password deve essere la digitazione della lettera Q

tu potresti anche decidere di farlo uscire quando marte è in congiunzione con urano o quel che ti pare

Gogeta ss4
03-06-2004, 20:23
il carattere di invio comè ??

LukeHack
04-06-2004, 00:27
Originariamente inviato da Gogeta ss4
il carattere di invio comè ??
\n

Gogeta ss4
04-06-2004, 15:07
se premo invio non esce, prende un invio come un qualsiasi tasto

cionci
04-06-2004, 15:15
Facci vedere il codice...

Gogeta ss4
04-06-2004, 15:52
#include <stdio.h>
#include <conio.h>
main()
{
int c;
while((c = getch()) != '\n') // premere Q per uscire
printf("*");
getch();
}

cionci
04-06-2004, 16:45
Sostituisci \n con \r... In realtà il carattere di invio viene sintetizzato (su Windows) con due caratteri...\n e \r... Probabilmente \n non viene mantenuto nel buffer, ma vi rimane solamente \r...

Gogeta ss4
04-06-2004, 17:00
funzia

sirus
04-06-2004, 19:05
esiste anche la funzione kbhit() che controlla unicamente se c'è un carattere nel buffer della tastiera ;)

LukeHack
04-06-2004, 21:35
Originariamente inviato da sirus
esiste anche la funzione kbhit() che controlla unicamente se c'è un carattere nel buffer della tastiera ;)
ma la pressione di invio METTE NEL BUFFER un carattere,quindi la kbhit() non è appropriata per questa ipotesi

lucas72
05-06-2004, 13:31
Ciao
Interessa anche a me questa cosa, però non ho capito la sua utilità pratica.
A cosa ti serve?
Come si fa ad assegnare a questo punto le "lettere" dei tasti ad una
varibile di tipo string o char[] in modo ad esempio, che risulti, una password
per entrare in una procedura? (ho aperto anche io una discussione simile)
grazie

LukeHack
05-06-2004, 15:04
Originariamente inviato da lucas72
Ciao
Interessa anche a me questa cosa, però non ho capito la sua utilità pratica.
A cosa ti serve?
Come si fa ad assegnare a questo punto le "lettere" dei tasti ad una
varibile di tipo string o char[] in modo ad esempio, che risulti, una password
per entrare in una procedura? (ho aperto anche io una discussione simile)
grazie
EH?

lucas72
06-06-2004, 11:51
Originariamente inviato da LukeHack
EH?


Eh? Cosa?
ciao

LukeHack
06-06-2004, 14:56
Originariamente inviato da lucas72
Eh? Cosa?
ciao
non si capisce cosa ti serve :muro:

maxithron
07-06-2004, 12:29
[edit]

lucas72
07-06-2004, 18:45
Originariamente inviato da LukeHack
non si capisce cosa ti serve :muro:


..mi sembrava chiaro scusate
Cosa me ne faccio di asterischi sullo schermo in se e per se
di solito quando si usa questo metodo si nasconde una password
che però (una volta dato invio) effettivamente viene inviata.

Ad esempio se la password è: pippo gli asterischi
nasconderanno la parola così ***** a me serve che sia la parola
pippo assegnata effettivamente ad una variabile
Mi sfugge qualcosa?

cionci
07-06-2004, 18:51
#include <stdio.h>
#include <conio.h>
main()
{
int c, n = 0;
char password[21]
while((c = getch()) != '\r') { // premere Q per uscire
printf("*");
if(n < 20)
password[n++] = c;
}
password[n] = '\0'; /*inserisce il terminatore di stringa*/
getch();
}

LukeHack
08-06-2004, 01:47
Originariamente inviato da cionci

#include <stdio.h>
#include <conio.h>
main()
{
int c, n = 0;
char password[21]
while((c = getch()) != '\r') { // premere INVIO per uscire
printf("*");
if(n < 20)
password[n++] = c;
}
password[n] = '\0'; /*inserisce il terminatore di stringa*/
getch();
}

se sostituisco \n con \r (perchè altrimenti va in loop infinito) lui si ferma ma solo dopo aver premuto un qualsiasi altro tasto dopo INVIO...
come mai? :wtf:

ri
08-06-2004, 08:39
lo vedi quel getch finale? ecco bravo...

LukeHack
08-06-2004, 11:05
Originariamente inviato da ri
lo vedi quel getch finale? ecco bravo...
:mad:
intendo dire che non esce dal loop,PRIMA del getch() finale...!

cionci
08-06-2004, 11:27
Sinceramente a me va bene:

#include <stdio.h>
#include <conio.h>
main()
{
int c, n = 0;
char password[21];
while((c = getch()) != '\r') { // premere INVIO per uscire
if(n < 20)
{
printf("*");
password[n++] = c;
}
}
password[n] = '\0'; /*inserisce il terminatore di stringa*/
printf("\n%s\n",password);
}

LukeHack
08-06-2004, 15:54
Originariamente inviato da cionci
Sinceramente a me va bene:

#include <stdio.h>
#include <conio.h>
main()
{
int c, n = 0;
char password[21];
while((c = getch()) != '\r') { // premere INVIO per uscire
if(n < 20)
{
printf("*");
password[n++] = c;
}
}
password[n] = '\0'; /*inserisce il terminatore di stringa*/
printf("\n%s\n",password);
}



si è vero! va bene oggi funziona! :eek: chissà ieri notte che cacchio c'ho messo nel codice per avere quel risultato! cmq sotto linux non compila,ho incluse le curses.h ma mi dà errori sulla libreria :eek: qualcuno di voi può provare?

LukeHack
08-06-2004, 15:56
Originariamente inviato da cionci

#include <stdio.h>
#include <conio.h>
main()
{
int c, n = 0;
char password[21]
while((c = getch()) != '\r') { // premere Q per uscire
printf("*");
if(n < 20)
password[n++] = c;
}
password[n] = '\0'; /*inserisce il terminatore di stringa*/
getch();
}

allora non solo a me con \n non usciva dal loop (condizione del while)...puoi provare sotto linuz magari verifico se ho un problema io col compilatore?:)

cionci
08-06-2004, 16:06
La cosa dello \n l'avevo corretta qualche post fa (sul codice di inizio thread)...poi ho preso il codice postato per scrivere questo sopra, ma avevo preso quello con lo \n ;)

LukeHack
08-06-2004, 16:22
Originariamente inviato da cionci
La cosa dello \n l'avevo corretta qualche post fa (sul codice di inizio thread)...poi ho preso il codice postato per scrivere questo sopra, ma avevo preso quello con lo \n ;)
LOL
cmq puoi provare sotto gcc?

cionci
08-06-2004, 16:26
No..ora Linux l'ho su un HD che è staccato ;)
Al amssimo posso provare con MinGW32, ma non credo che faccia la differenza... Il problema è magari lo \r sotto Linux...

lucas72
08-06-2004, 19:31
ok
la provo pure io la soluzione di cionci e vediamo se va!
grazie era quello che mi interessava comunque.
(a quanto pare la mia richiesta non era poi così tanto astrusa:D :D :D )
Ciao

LukeHack
08-06-2004, 21:00
Originariamente inviato da cionci
No..ora Linux l'ho su un HD che è staccato ;)
Al amssimo posso provare con MinGW32, ma non credo che faccia la differenza... Il problema è magari lo \r sotto Linux...
no il problema è che non compila :mad:

cionci
08-06-2004, 23:40
Ah...per il getch...non è standard... E' poco portabile... Sotto linux ci dovrebbe essere una funzione simile nelle NCURSES...

LukeHack
08-06-2004, 23:42
Originariamente inviato da cionci
Ah...per il getch...non è standard... E' poco portabile... Sotto linux ci dovrebbe essere una funzione simile nelle NCURSES...
A program using these routines must be linked with the
-lncurses option, or (if it has been generated) with the
debugging library -lncurses_g.

ecco il motivo;)

ri
08-06-2004, 23:47
no, il problema è che per usare le ncurses devi inizializzare lo schermo con initscr();
al termine del programma (o del punto in cui si fa uso delle ncurses) si deve chiamare la endwin();
per disattivare l'echo della getch si deve richiamare la noecho(); (echo() per riattivarlo)
divertiti...

LukeHack
09-06-2004, 00:06
#include <stdio.h>
#include <curses.h>
main()
{
initscr();
int c, n = 0;
char password[21];
noecho();
while((c =getch()) != '\n') { // premere Q per uscire

if(n < 20)
password[n++] = c;

}
password[n] = '\0'; /*inserisce il terminatore di stringa*/
endwin();
printf("la passwd è %s\n",password);
}

thanx RI ;)

cionci
09-06-2004, 00:11
Su Linux funziona solo con \n scommetto...

LukeHack
09-06-2004, 00:12
Originariamente inviato da cionci
Su Linux funziona solo con \n scommetto...
;) eggià:D

ri
09-06-2004, 08:39
ma sai che non ho provato con \r?

cionci
09-06-2004, 08:51
Credo che sia inutile...visto che lo \r non viene nemmeno inviato nello stream dal tasto invio ;)

lucas72
09-06-2004, 19:38
va bene

Ho provato ad inserire un ciclo if else che
controlli se la password inserita sia identica
ad una determinata parola, una cosa del tipo:

if(password=="pippo")
cout<<"ok pass esatta";
else
cout<<Pass non esatta, riprovare";

ma ottengo sempre l'istruzione di else.
Qual'è il problema?
Scusatemi e abbiate pazienza, non sono una cima in c++
e sicuramente mi sfugge qualcosa.
ciao.

ri
09-06-2004, 20:11
per confrontare le stringhe C devi usare la funzione appropriata, ovvero la strcmp...

LukeHack
10-06-2004, 04:24
Originariamente inviato da lucas72
va bene

Ho provato ad inserire un ciclo if else che
controlli se la password inserita sia identica
ad una determinata parola, una cosa del tipo:

if(password=="pippo")
cout<<"ok pass esatta";
else
cout<<Pass non esatta, riprovare";

ma ottengo sempre l'istruzione di else.
Qual'è il problema?
Scusatemi e abbiate pazienza, non sono una cima in c++
e sicuramente mi sfugge qualcosa.
ciao.
#include <stdio.h>
#include <curses.h>
main()
{
initscr();
int c, n = 0;
char password[21];
noecho();
while((c =getch()) != '\n') { // premere Q per uscire

if(n < 20)
password[n++] = c;

}
password[n] = '\0'; /*inserisce il terminatore di stringa*/
endwin();
if (strcmp(password,"pippo")==0)
printf("tutto apposto!");
printf("la passwd è %s\n",password);
}
// gcc -o asd getch\(\)_ncurses.c -lncurses_g ;)

ri
10-06-2004, 08:32
ma sono l'unico che pensa che il modo migliore per far imparare sia solo dare un suggerimento e non dare il codice già pronto?

LukeHack
10-06-2004, 12:37
Originariamente inviato da ri
ma sono l'unico che pensa che il modo migliore per far imparare sia solo dare un suggerimento e non dare il codice già pronto?
direi di si ;)
il tuo discorso per carità e validissimo,ma con me o con altri gia smaliziati,non coi niubboni,i quali vanno trattati a pezzi di codice COMMENTATI...
sennò non progrediscono,si arenano sulle cavolate (notare il commento finale,in cui compare pure la riga di compilazione:D)

ri
10-06-2004, 12:40
bah, se uno vuole passare dalla fase niubbo alla fase smanettatore deve cozzare il più violentemente possibile contro un muro di indifferenza: o impara a risolversi da solo i problemi e, se e solo se non riesce, poi chiedere aiuto, o smette di programmare per il resto della sua vita :asd:

LukeHack
10-06-2004, 12:48
Originariamente inviato da ri
bah, se uno vuole passare dalla fase niubbo alla fase smanettatore deve cozzare il più violentemente possibile contro un muro di indifferenza: o impara a risolversi da solo i problemi e, se e solo se non riesce, poi chiedere aiuto, o smette di programmare per il resto della sua vita :asd:
perfido :D :sofico:

lucas72
10-06-2004, 18:51
ok
scusate l'ignoranza

..volevo aggiungere che anche io i problemi cerco di risolverli da me
(e molte volte ci riesco)
Capita però che ci si trova impaludati in un problema che un niubbo
non riesce a superare (perdendosi magari anche nel classico bicchiere d'acqua) e deve far ricorso al forum per uscire dallo stallo (mentale)
e almeno nel mio caso, per carità, il codice risulta essere spesso indispensabile.

Ho frequentato altri forum nel quale cercavano di aiutarti fornendoti
le linee guida per la costruzione del codice (utilizzando spesso un linguaggio tecnico totalmente incomprensibile con le mie attuali conoscenze)