Paras vastaus
Tämä on yksi suosikkikysymyksistäni C ++: n hylkäämiseen asiantuntijat .
Tietysti järjestelmä (”PAUSE”) tarkoittaa, että luodaan käyttöjärjestelmän kuori ja annetaan sen suorittaa ”PAUSE” -komento.
Oikeastaan toimii vain Windowsissa, joissa se EI OLE tietoturvaongelma , koska” PAUSE ”on shell-sisäinen komento, joka ei kutsu mitään ulkoista ohjelmaa (ellet itse järjestelmän kuori ole hakkeroitu … mutta kuin sinulla on toinen ongelma)
Windowsissa se ei edes ole iso ”suorituskykyongelma”: CMD.EXE-kuva on melkein varmasti jo RAM-muistissa, CMD-tietosegmentti on melko pieni ja… no … pyydät TAUKOITTAMISTA (ei ajaa niin nopeasti kuin pystyt!)
Järjestelmissä muissa kuin Windowsissa , tämä ei toimi (PAUSE-komentoa ei välttämättä ole) ja se on tietoturvavuoto (joku noin n luo PAUSE-ohjelma tekemään oman tehtävän sinun sijasta).
Joten ellet kohdista omaa ainoaa konettasi ja omaa ainoaa käyttöjärjestelmääsi, se ei ole kannettava ja voi olla jopa vaarallinen.
Mutta ongelmasta tulee nyt ” mitä tehdä sen sijaan?”
On upeaa nähdä, kuinka suurin osa vastaus on… VIRHE , koska… he eivät voi toimia!
Katsotaanpa miksi:
Ohjelmasi cin
-s kaksi kokonaislukua, näyttää tuloksia ja… onko sen odotettava tai poistuttava?
Oletetaan haluat odottaa: miten vastaat ryhmiin cin >> a
ja cin >> b
?
Tuloksesi näyttää tältä
12\n
34\n
sinun on kirjoitettava nämä f. .ing palauttaa, koska sinun on poistuttava konsolin syöttötilasta.
Nyt cin >> a
kuluttaa ”12”. Paluu pysyy puskurissa.
cin >> b
kuluttaa kaikki välilyönnit (sisältäen palautukset) ensimmäiseen ei-välilyöntiin asti kuin kaikki numerot. Se kuluttaa ”\ n34” (ja aseta b = 34).
Tulopuskurissa on f… paluu. Joten nyt katsotaan, kuinka kaikki asiantuntijat epäonnistui!
- käyttävät
cin.get()
: VIRHE : Tämä lukee yhden merkin ja jatkuu. Ja syöttöpuskurissa on yksi merkki, joten se ei keskeytä ! - käytä
cin.ignore()
: VIRHE: Puskurissa on edelleen tämä tuleva paluu. Ohitat sen … ja mene pidemmälle. Ei taukoa .
Kuinka sinun pitäisi tehdä se?
Tässä näytteessä täytyy jättää huomioimatta kaikki puskurissa olevat paluut mukaan lukien ja pyytää jotain muuta ohitettavaksi:
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, on… mikä tahansa suurempi kuin merkit, joihin voit kirjoittaa konsoli ennen Enter-näppäimen painamista.
Tavallinen tapa saada tämä numero on
numeric\_limits
(don unohda #include
)
Joten loppuun mennessä …
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
cin.get();
}
tulee ole oikea tauko -toiminto.
Mutta kerro nyt:
Entä jos joku kirjoittaa
12abcd\n
??
Ensimmäisessä käsittelyssä lukee” 12 ”ja toisessa” a … ”ja se epäonnistuu (ei numeroa!) B: tä ei lueta ollenkaan.
Kuin pause()
tyhjentää ”huonon bitin” ja hylkää abcd\n
, sitten lue ”1” ja poistu onnellisella tavalla.
Moraali : kun luket numeroita, tarkista aina, että lukeminen epäonnistui ja hylkää mahdolliset virheelliset syötteet:
while(!(cin >> b))
{ cin.clear(); cin.ignore(numeric\_limits
Mutta tämä vaatii myös hallintaa kehotteita ja niin edelleen … ja johtaa liian kauas todellisesta tarkoituksesta.
Vastaa
Se ei ole puhdas ratkaisu. Jotkut ihmiset saattavat kutsua sitä ”hakkeroinniksi”, jotkut ihmiset voivat kutsua sitä ”kiertotavaksi”.
Näet, että yksi C-kielen mukavista ominaisuuksista on sen siirrettävyys . Ja järjestelmän (”PAUSE”) syntaksin kanssa menetät tämän siirrettävyyden, koska se riippuu konsolista, jota käytät ohjelman ajamisessa.
Kuinka vaihtoehdot ovat? Valitettavasti ei ole täysin puhdasta ratkaisua. Olen nähnyt ihmisten käyttävän tätä syntaksia
std::cout << “Press any key to continue…”;
std::cin >> Some\_variable\_you\_declared\_in\_advance;
Tämä on pohjimmiltaan vain yksi hakkerointi, jonka avulla voit keskeyttää ohjelman striimin avulla. Mutta et menetä siirrettävyyttäsi tällä tavalla.
Yksi puhtaimmista ratkaisuista, jonka tiedän, on tämä (mutta se riippuu hyvin makusta):
void pause () {
std::cin.ignore();
}
Tällä tavalla voit käyttää omaa taukotoimintoa . Se lukee periaatteessa yhden merkin ja jättää sen huomiotta, mikä on juuri se, mitä haluat saavuttaa. Mutta kuten sanoin, se ei todellakaan ole paras ratkaisu, vain henkilökohtainen suosikkini.