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!
- 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 ! - 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
(don ne felejtsd el #include
)
Tehát a végére …
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
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
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.