Vilka är nackdelarna med att använda paus i systemet?


Bästa svaret

Det här är en av mina favoritfrågor att diskvalificerar C ++ experter .

Naturligtvis betyder system (”PAUSE”) att skapa ett OS-skal och låta det utföra ett ”PAUSE” -kommando.

Egentligen att fungerar bara på windows, där det INTE är ett säkerhetsproblem , eftersom” PAUSE ”är ett skal-internt kommando som inte åberopar något externt program (såvida inte ditt systemskal själv är hackat … men än du har ett annat problem)

På Windows är det inte ens ett stort ”prestandaproblem”: bilden av CMD.EXE är nästan säkert redan i RAM, CMD-datasegmentet är ganska litet och … ja … du ber om att PAUSA (inte springa så fort du kan!)

På system annat än fönster , detta fungerar inte (det kan finnas inget PAUS-kommando) och är en säkerhetsläcka (någon ca n skapa ett PAUS-program för att utföra sin egen uppgift istället för din).

Så om du inte riktar in dig mot din egen enda maskin och ditt eget enda operativsystem, så är det inte bärbart och kan till och med vara farligt.

Men problemet blir nu ” vad ska jag göra istället?”

Det är ”fantastiskt att se hur det mesta av svaret är … FELT , eftersom … de kan inte fungera!

Låt oss se varför:

Ditt program cin -s två heltal, visa några resultat och … måste det vänta eller avsluta?

Låt oss anta du vill vänta: hur svarar du på cin >> a och cin >> b?

Din inmatning ser ut som

12\n

34\n

MÅSTE du skriva dessa f. .ing återvänder eftersom du måste lämna konsolinmatningsläget.

Nu kommer cin >> a att konsumera ”12”. Returen kommer att förbli i bufferten.

cin >> b förbrukar alla mellanslag (inkluderar retur) tills det första icke-mellanslaget än alla siffrorna. Det kommer att konsumera “\ n34” (och ställa in b = 34).

Det finns en f … ing avkastning i ingångsbufferten. Så nu ska vi se hur alla experter FAIL!

  1. använder cin.get(): FEL : Detta kommer att läsa en tecken och fortsätta. Och det finns ett tecken i ingångsbufferten, så det pausar inte !
  2. använd cin.ignore(): FEL: Det finns fortfarande att f … ing avkastning i bufferten. Du ignorerar det … och går längre. Ingen paus .

Så hur ska du göra det?

I detta specifika exempel, du måste ignorera allt finns i bufferten till och med returen, be sedan om något annat att ignorera:

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, är … något större än de tecken du kan skriva på konsolen innan du trycker på enter.

Standardmetoden för att få detta nummer är

numeric\_limits::max()

(don t glöm #include )

Så i slutet …

void pause()

{

cin.clear();

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

cin.get();

}

kommer var en riktig paus -funktion.

Men säg mig nu:

Vad händer om någon skriver

12abcd\n

??

Den första läsningen kommer att se” 12 ”och den andra” a … ”och kommer att misslyckas (inte en siffra!). B läses inte alls.

Än pause() rensar ”dålig bit” och kasserar abcd\n läs ”1” och avsluta gärna.

Moral : när du läser siffror ska du alltid kontrollera att läsningen misslyckades och kasta eventuell dålig inmatning:

while(!(cin >> b))

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

Men detta kräver också hantering av uppmaningar och så vidare … och leder för långt ifrån det verkliga syftet.

Svar

Det är inte en ren lösning. Vissa människor kan kalla det ”hacka”, vissa kan kalla det ”lösning”.

Du förstår, en av de trevliga egenskaperna hos C-språket är dess bärbarhet . Och med system (”PAUSE”) syntax förlorar du denna bärbarhet, eftersom det beror på konsolen du använder för att köra ditt program.

Hur är alternativen nu? Tyvärr finns det ingen helt ren lösning. Jag har sett människor som använder denna syntax

std::cout << “Press any key to continue…”;

std::cin >> Some\_variable\_you\_declared\_in\_advance;

I grund och botten är detta bara ett nytt hack, med ström för att pausa ditt program. Men du tappar inte din bärbarhet på detta sätt.

En av de renaste lösningarna jag vet är den här (men den är mycket smakberoende):

void pause () {

std::cin.ignore();

}

På detta sätt kan du använda din egen pausfunktion . Den läser i princip en karaktär och ignorerar den, vilket är exakt vad du vill uppnå. Men som sagt är det verkligen inte den bästa lösningen, bara min personliga favorit.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *