Migliore risposta
Questa è una delle mie domande preferite per squalificare C ++ esperti .
Ovviamente sistema (“PAUSA”) significa creare una shell del sistema operativo e lasciarle eseguire un comando “PAUSA”.
In realtà, funziona solo su Windows, dove NON è un problema di sicurezza , poiché” PAUSE “è un comando interno alla shell che non richiama alcun programma esterno (a meno che la shell di sistema non sia essa stessa hackerata … ma poi hai un altro problema)
Su Windows non è nemmeno un grosso “problema di prestazioni”: limmagine di CMD.EXE è quasi sicuramente già nella RAM, il segmento di dati CMD è piuttosto piccolo e … beh … stai chiedendo di PAUSA (non di eseguire il più velocemente possibile!)
Su sistemi diversi da Windows , non funzionerà (potrebbe non esserci alcun comando PAUSE) ed è una perdita di sicurezza (qualcuno ca n creare un programma PAUSE per svolgere il proprio compito anziché il tuo).
Quindi, a meno che tu non stia prendendo di mira la tua unica macchina e il tuo unico sistema operativo, questo non sarà portatile e potrebbe essere persino pericoloso.
Ma ora il problema diventa “ cosa fare invece?”
È fantastico vedere come la maggior parte del le risposte sono … SBAGLIATO , perché … non possono funzionare!
Vediamo perché:
Il tuo programma cin
-s due numeri interi, mostra alcuni risultati e … deve aspettare o uscire?
Supponiamo vuoi aspettare: come rispondi a cin >> a
e cin >> b
?
Il tuo input sarà simile a
12\n
34\n
DEVI digitare quelle f. .ing restituisce, perché è necessario uscire dalla modalità di input della console.
Ora, cin >> a
consumerà “12”. Il ritorno rimarrà nel buffer.
cin >> b
consumerà tutti gli spazi (inclusi i ritorni) fino al primo non spazio, poi tutte le cifre. Consumerà “\ n34” (e imposterà b = 34).
Cè fino a un f … ritorni nel buffer di input. Quindi ora vediamo come tutti gli esperti FAIL!
- usano
cin.get()
: SBAGLIATO : questo leggerà un carattere e continuerà. Inoltre è presente un carattere nel buffer di input, quindi non verrà messo in pausa ! - usa
cin.ignore()
: SBAGLIATO: Cè ancora quel f … ritorni nel buffer. Lo ignori … e vai oltre. Nessuna pausa .
Quindi come dovresti farlo?
In questo particolare esempio, tu devi ignorare tutto ciò che è nel buffer fino al ritorno incluso, quindi chiedere qualcosaltro da ignorare:
cin.clear(); // clear an eventual "bad read" flag
cin.ignore(BIG\_NUMBER,’\n’); // ignore all remaining pending input
cin.get(); //just read one more!
BIG\_NUMBER, è … qualsiasi cosa più grande dei caratteri che puoi digitare la console prima di premere invio.
Il modo standard per ottenere questo numero è
numeric\_limits
(don non dimenticare #include
)
Quindi, alla fine …
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
cin.get();
}
essere una funzione pausa appropriata.
Ma ora dimmi:
E se qualcuno digita
12abcd\n
??
La prima lettura vedrà” 12 “e la seconda” a … “e fallirà (non una cifra!). B non viene letto affatto.
Quindi pause()
cancellerà il “bit difettoso” e scarterà abcd\n
, quindi leggi “1” ed esci felicemente.
Morale : quando leggi i numeri controlla sempre che la lettura non abbia avuto esito negativo, ed elimina leventuale input errato:
while(!(cin >> b))
{ cin.clear(); cin.ignore(numeric\_limits
Ma questo richiede anche la gestione di prompt e così via … e porta troppo lontano dallo scopo reale.
Risposta
Non è una soluzione pulita. Alcune persone potrebbero chiamarlo “hack”, altre potrebbero chiamarlo “workaround”.
Vedi, una delle proprietà piacevoli del linguaggio C è il suo portabilità . E con la sintassi di sistema (“PAUSA”), stai perdendo questa portabilità, perché dipende dalla console che stai usando per eseguire il tuo programma.
Ora, come quali sono le alternative? Purtroppo, non esiste una soluzione perfettamente pulita. Ho visto persone utilizzare questa sintassi
std::cout << “Press any key to continue…”;
std::cin >> Some\_variable\_you\_declared\_in\_advance;
Fondamentalmente, questo è solo un altro trucco, usando lo stream per mettere in pausa il tuo programma. Ma non stai perdendo la tua portabilità in questo modo.
Una delle soluzioni più pulite che conosco è questa (ma dipende molto dal gusto):
void pause () {
std::cin.ignore();
}
In questo modo, puoi utilizzare la tua funzione di pausa . Fondamentalmente legge un personaggio e lo ignora, che è esattamente ciò che vuoi ottenere. Ma come ho detto, non è certamente la soluzione migliore, solo la mia preferita.