Milyen hátrányai vannak a rendszerszünet használatának?


Legjobb válasz

Ez az egyik kedvenc kérdésem a C ++ kizárásához szakértők .

Természetesen a rendszer („SZÜNET”) azt jelenti, hogy hozzon létre egy operációs rendszert futtató héjat, és hagyja végrehajtani a „SZÜNET” parancsot.

Valójában az, hogy csak Windows rendszeren működik, ahol NEM jelent biztonsági problémát , mivel a„ PAUSE ”egy shell-belső parancs, amely nem hív meg semmilyen külső programot (kivéve, ha maga a rendszerhéj feltört). de mint egy másik problémád van)

Windowson ez még nem is nagy „teljesítményprobléma”: a CMD.EXE képe szinte biztosan már a RAM-ban van, a CMD adatszegmens meglehetősen kicsi és… nos … azt szünetelteti, hogy ne fusson olyan gyorsan, amennyit csak tud!)

olyan rendszereken, amelyek nem a Windows , ez nem fog működni (lehet, hogy nincs SZÜNET parancs) és biztonsági szivárgás (valaki kb. n hozzon létre egy SZÜNET programot, hogy a saját feladata legyen az ön helyett).

Tehát, hacsak nem csak a saját gépét és csak a saját operációs rendszerét célozza meg, az nem lesz hordozható, sőt veszélyes is lehet.

De a probléma most „ mit kell tennie ?”

Fantasztikus látni, hogy a a válaszok: ROSSZ , mert… nem tudnak működni!

Lássuk, miért:

A program cin -s két egész számot mutat, mutat néhány eredményt, és … várnia kell, vagy ki kell lépnie?

Tegyük fel, hogy várni szeretnél: hogyan válaszolsz a cin >> a és cin >> b kérdésekre?

A beviteled úgy fog kinézni, mint

12\n

34\n

KELL írnia ezeket az f-eket. A .ing visszatér, mert ki kell lépnie a konzol beviteli módjából.

Most a cin >> a értéke 12 lesz. A visszatérés a pufferben marad.

cin >> b az összes szóközt (beleértve a visszatéréseket is) felemészti az első nem szóközig, mint az összes számjegyet. Fogyasztja a „\ n34” értéket (és beállítja a b = 34 értéket).

A bemeneti pufferben egy f… visszatérés van. Tehát most nézzük meg, hogy az összes szakértő FAIL!

  1. használja a cin.get() ROSSZ : Ez egy karaktert olvas és folytatódik. És van egy karakter a bemeneti pufferben, ezért nem szünetel !
  2. használja a cin.ignore(): ROSSZ: A pufferben még mindig van olyan visszatérő visszatérés. Figyelmen kívül hagyja … és tovább megy. Nincs szünet .

Tehát hogyan kell elkészítenie?

Ebben a konkrét mintában figyelmen kívül kell hagynia mindent, ami a pufferben van, a visszatérésig számítva, majd kérjen valami mást, amelyet figyelmen kívül hagy:

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, bármi nagyobb, mint a beírható karakterek a konzol előtt nyomja meg az Enter billentyűt.

Ennek a számnak a megszerzésére szokásosan

numeric\_limits::max()

(don ne felejtsd el #include )

Tehát a végére …

void pause()

{

cin.clear();

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

cin.get();

}

legyen egy megfelelő szünet függvény.

De most mondja meg:

Mi van, ha valaki beírja

12abcd\n

??

Az első olvasásnál a„ 12 ”, a másodikban a a… jelenik meg, és nem fog sikerülni (nem egy számjegy!). A B egyáltalán nincs olvasva.

A pause() mint a „rossz bit” törli és a abcd\n elemet eldobja, majd olvassa el az „1” szót, és boldogan lépjen ki.

Erkölcs : a számok olvasásakor mindig ellenőrizze, hogy az olvasás nem sikerült-e, és dobja el az esetleges rossz bevitelt:

while(!(cin >> b))

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

De ehhez kezelésre is szükség van és így tovább … és túl messze vezet a tényleges céltól.

Válasz

Ez nem tiszta megoldás. Vannak, akik „hacknek”, mások „megkerülőnek” nevezhetik.

Látja, a C nyelv egyik kedves tulajdonsága a hordozhatóság . És a rendszer („SZÜNET”) szintaxissal elveszíti ezt a hordozhatóságot, mert az a konzolon múlik, amelyet a program futtatásához használ.

Most mik azok az alternatívák? Sajnos nincs tökéletesen tiszta megoldás. Olyan embereket láttam, akik ezt a szintaxist használják

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

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

Alapvetően ez csak egy újabb hack, a stream használatával szünetelteti a programot. De nem veszíti el így a hordozhatóságát.

p> std::cin.ignore();

}

Így használhatja saját szünet funkcióját . Alapvetően egy karaktert olvas, és figyelmen kívül hagyja, pontosan ezt szeretné elérni. De mint mondtam, ez bizony nem a legjobb megoldás, csak a személyes kedvencem.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük