Cel mai bun răspuns
Aceasta este una dintre întrebările mele preferate pentru a descalifica C ++ experts .
Desigur, sistemul („PAUSE”) înseamnă să creați un shell OS și lăsați-l să execute o comandă „PAUSE”.
De fapt, acel funcționează numai pe Windows, unde NU este o problemă de securitate , deoarece„ PAUSE ”este o comandă internă a shell-ului care nu invocă niciun program extern (cu excepția cazului în care shell-ul sistemului este el însuși piratat … dar decât aveți o altă problemă)
Pe Windows nici măcar nu este o mare „problemă de performanță”: imaginea CMD.EXE este aproape sigur deja în RAM, segmentul de date CMD este destul de mic și … bine … solicitați PAUSE (să nu ruleze cât de repede puteți!)
Pe sistemele altele decât Windows , acest lucru nu va funcționa (s-ar putea să nu existe comandă PAUSE) și este o scurgere de securitate (cineva ca n creați un program PAUSE pentru a-și îndeplini propria sarcină în loc de a dvs.).
Deci, cu excepția cazului în care vizați singurul dvs. computer și singurul dvs. sistem de operare, acesta nu va fi portabil și poate fi chiar periculos.
Dar problema devine acum „ ce să faci ?”
Este fantastic să vezi cum sunt cele mai răspunsul este … GREȘIT , deoarece … nu pot funcționa!
Să vedem de ce:
Programul dvs. cin
-s două numere întregi, arată câteva rezultate și … trebuie să aștepte sau să iasă?
Să presupunem vrei să aștepți: cum răspunzi la cin >> a
și cin >> b
?
Intrarea ta va arăta ca
12\n
34\n
TREBUIE să tastați cele f. .ing revine, deoarece trebuie să ieșiți din modul de intrare a consolei.
Acum, cin >> a
va consuma „12”. Returnarea va rămâne în buffer.
cin >> b
va consuma toate spațiile (include returnările) până la primul spațiu non, decât toate cifrele. Va consuma „\ n34” (și va seta b = 34).
Există până la o întoarcere în bufferul de intrare. Așadar, acum să vedem cum toți experții NU reușesc!
- folosesc
cin.get()
: GREȘIT : Aceasta va citi un caracter și va continua. Și există un caracter în bufferul de intrare, deci nu se va întrerupe ! - utilizați
cin.ignore()
: GRAV: Există încă această revenire în buffer. O ignori … și mergi mai departe. Fără pauză .
Deci, cum ar trebui să o faci?
În acest eșantion special, tu trebuie să ignorați totul în buffer până la returnare inclusiv, apoi cereți altceva de ignorat:
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, este … ceva mai mare decât caracterele pe care poți tasta consola înainte de a accesa Enter.
Modul standard de a obține acest număr este
numeric\_limits
(don nu uitați #include
)
Deci, până la sfârșit …
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
cin.get();
}
fii o funcție adecvată pauză .
Dar acum spune-mi:
Ce se întâmplă dacă cineva tastează
12abcd\n
??
Prima citire va vedea„ 12 ”și a doua„ a … ”și va eșua (nu o cifră!). B nu este citit deloc.
Decât pause()
va șterge „bitul rău” și va arunca abcd\n
, citiți „1” și ieșiți fericit.
Morală : atunci când citiți numerele verificați întotdeauna citirea nu a eșuat și aruncați eventualele intrări greșite:
while(!(cin >> b))
{ cin.clear(); cin.ignore(numeric\_limits
Dar acest lucru necesită și gestionare de solicitări și așa mai departe … și duce prea departe de scopul real.
Răspuns
Nu este o soluție curată. Unii oameni îl pot numi „hack”, unii oameni îl pot numi „soluție”.
Vedeți, una dintre proprietățile frumoase ale limbajului C este portabilitate . Și cu sintaxa sistemului („PAUZĂ”), pierdeți această portabilitate, deoarece depinde de consola pe care o utilizați pentru a rula programul dvs.
Acum, cum sunt alternativele? Din păcate, nu există o soluție perfect curată. Am văzut oameni care folosesc această sintaxă
std::cout << “Press any key to continue…”;
std::cin >> Some\_variable\_you\_declared\_in\_advance;
Practic, acesta este doar un alt hack, care utilizează fluxul pentru a întrerupe programul. Dar nu vă pierdeți portabilitatea în acest fel.
Una dintre cele mai curate soluții pe care o știu este aceasta (dar este foarte dependentă de gust):
void pause () {
std::cin.ignore();
}
În acest fel, puteți utiliza propria funcție de pauză . Practic citește un personaj și îl ignoră, exact ceea ce vrei să obții. Dar, așa cum am spus, cu siguranță nu este cea mai bună soluție, ci doar preferatul meu personal.