Oppure

Loading
06/02/20 13:53
DVD_DAVIDE
Ciao a tutti, ho fatto un programma e c'è un blocco per l'uscita o il replay di questo. Per il replay l'utente deve digitare r/R, ma vorrei che potesse uscire semplicemente digitando il tasto invio. Ho provato a digitare 'cin;' ma il programma lo salta semplicemente ed anche dichiarando la variabile void non funziona. Come posso fare?
Grazie,
Davide
aaa
06/02/20 15:15
AldoBaldo
Puoi mettere insieme una funzione int conferma_uscita( void ); che restituisca 1 (per "vero";) se viene digitato direttamente invio, 0 (per "falso";) se viene digitato 'r' o 'R' seguito direttamente da invio, e che non ritorna proprio se viene digitata qualsiasi altra cosa. In caso l'immissione non fosse tra le due indicate come valide, la funzione potrebbe continuare a chiedere ostinatamente se si desidera lasciare il programma o ripeterne l'esecuzione.

Il programma e' in esecuzione.

Ripeto l'esecuzione del programma?  r

Il programma e' in esecuzione.

Ripeto l'esecuzione del programma?  R

Il programma e' in esecuzione.

Ripeto l'esecuzione del programma?  rt
Non ho capito. Ripeto l'esecuzione del programma?  gre2
Non ho capito. Ripeto l'esecuzione del programma?  r

Il programma e' in esecuzione.

Ripeto l'esecuzione del programma?

Process returned 0 (0x0)   execution time : 24.119 s
Press any key to continue.


(N.B. anche se non si può leggere dal testo, all'ultima domanda ha fatto seguito l'uscita perche' ho inserito direttamente invio.)

Nel mio programma di test, main() ha questo semplicissimo aspetto:

int main() {
    do {
        printf( "\nIl programma e' in esecuzione.\n\n" );
    } while( !conferma_uscita() );

    return 0;
}
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
06/02/20 17:48
DVD_DAVIDE
Postato originariamente da AldoBaldo:
che restituisca 1 (per "vero") se viene digitato direttamente invio,

Ecco. Io volevo sapere se c'è un modo per far considerare il 'direttamente invio' al compilatore come carattere e poterlo utilizzare di conseguenza.
aaa
06/02/20 19:24
AldoBaldo
Per quel che ne so... ni.

Il tasto invio è quello che viene usato per chiudere una sequenza di input, per cui è sempre presente al termine di ogni immissione. Questo vale per getchar(), come per gets(), come per fgets()... C'è però il modo di sfruttare questa caratteristica per i tuoi scopi, "lavorandoci un po' intorno".

Considera, per esempio, l'uso di getchar(). Se uno scrive in console "ciao" e preme invio, usando c come variabile per ricevere l'input, quello che arriva al suo programma è:

c = getchar(); // in c c'e' 'c'
c = getchar(); // in c c'e' 'i'
c = getchar(); // in c c'e' 'a'
c = getchar(); // in c c'e' 'o'
c = getchar(); // in c c'e' '\n'


Dunque, basta che tu riceva l'input carattere per carattere fino a quando ti arriva '\n' e agisca di conseguenza.
Se '\n' ti arriva subito, significa che non è stato inserito niente prima che venisse premuto invio.

In altre parole, se uno "batte" subito invio senza avere inserito niente prima, quello che arriva al programma è:

c = getchar(); // in c c'e' '\n'
Ultima modifica effettuata da AldoBaldo 06/02/20 19:41
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.