Bedste svar
Dette er et af mine foretrukne spørgsmål til diskvalificerer C ++ eksperter .
Selvfølgelig betyder system (“PAUSE”) at oprette en OS-shell og lade den udføre en “PAUSE” -kommando.
Faktisk at fungerer kun på windows, hvor det IKKE er et sikkerhedsproblem , da” PAUSE “er en shell-intern kommando, der ikke påberåber sig noget eksternt program (medmindre din system shell selv er hacket … men end du har et andet problem)
På windows er det endda ikke et stort “ydeevneproblem”: billedet af CMD.EXE er næsten helt sikkert allerede i RAM, CMD-datasegmentet er ret lille og … godt … du beder om PAUSE (ikke at køre så hurtigt som muligt!)
På systemer andet end windows , dette fungerer ikke (der er muligvis ingen PAUSE-kommando) og er en sikkerhedslækage (nogen ca n Opret et PAUSE-program til at udføre sin egen opgave i stedet for din).
Så medmindre du målretter mod din egen eneste maskine og dit eget eneste operativsystem, er det ikke bærbart og kan endda være farligt.
Men problemet bliver nu “ hvad skal man gøre i stedet?”
Det er fantastisk at se, hvordan det mest af svaret er… forkert , fordi… de kan ikke arbejde!
Lad os se hvorfor:
Dit program cin
-s to heltal, viser nogle resultater og … skal det vente eller afslutte?
Lad os antage du vil vente: hvordan svarer du på cin >> a
og cin >> b
?
Dit input vil se ud som
12\n
34\n
SKAL du skrive dem f. .ing vender tilbage, fordi du skal afslutte konsolindgangstilstand.
Nu bruger cin >> a
“12”. Returen forbliver i bufferen.
cin >> b
bruger alle mellemrum (inkluderer retur) indtil det første ikke-mellemrum end alle cifrene. Det vil forbruge “\ n34” (og indstille b = 34).
Der er indtil et f… ing-retur i inputbufferen. Så lad os nu se, hvordan alle eksperter FAIL!
- bruger
cin.get()
: forkert : Dette vil læse et tegn og fortsætte. Og der er et tegn i inputbufferen, så det stopper ikke ! - brug
cin.ignore()
: forkert: Der er stadig, at f… ing afkast i bufferen. Du ignorerer det … og gå længere. Ingen pause .
Så hvordan skal du klare det?
I denne særlige prøve skal du nødt til at ignorere alt er i bufferen til og med returneringen, så bed om noget andet at ignorere:
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, er … noget større end de tegn, du kan skrive på konsollen før du trykker på enter.
Standardmetoden for at få dette nummer er
numeric\_limits
(don t glem #include
)
Så ved udgangen …
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
cin.get();
}
vil være en ordentlig pause -funktion.
Men fortæl mig nu:
Hvad hvis nogen skriver
12abcd\n
??
Den første læsning vil se” 12 “og den anden” a … “og vil mislykkes (ikke et tal!). B læses slet ikke.
End pause()
rydder den “dårlige bit” og kasserer abcd\n
læs “1” og afslut med glæde.
Moral : Når du læser tal, skal du altid kontrollere, at læsningen ikke mislykkedes, og kassér eventuelt dårlig input:
while(!(cin >> b))
{ cin.clear(); cin.ignore(numeric\_limits
Men dette kræver også styring af prompter og så videre … og fører for langt væk fra det egentlige formål.
Svar
Det er ikke en ren løsning. Nogle mennesker kalder det muligvis “hack”, nogle kalder det måske “løsning”.
Ser du, en af de gode egenskaber ved C-sprog er dens bærbarhed . Og med system (“PAUSE”) syntaks mister du denne bærbarhed, fordi det afhænger af den konsol, du bruger til at køre dit program.
Hvad er nu alternativerne? Desværre er der ingen perfekt ren løsning. Jeg har set folk, der bruger denne syntaks
std::cout << “Press any key to continue…”;
std::cin >> Some\_variable\_you\_declared\_in\_advance;
Dybest set er dette bare endnu et hack, der bruger stream til at sætte dit program på pause. Men du mister ikke din bærbarhed på denne måde.
En af de reneste løsninger, jeg kender, er denne (men den er meget afhængig af smag):
void pause () {
std::cin.ignore();
}
På denne måde kan du bruge din egen pausefunktion . Det læser grundlæggende et tegn og ignorerer det, hvilket er præcis det, du vil opnå. Men som sagt er det bestemt ikke den bedste løsning, bare min personlige favorit.