Care sunt dezavantajele utilizării pauzei de sistem?


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!

  1. 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 !
  2. 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::max()

(don nu uitați #include )

Deci, până la sfârșit …

void pause()

{

cin.clear();

cin.ignore(numeric\_limits::max(),’\n’);

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::max(),’\n’); }

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *