Beste Antwort
Dies ist eine meiner Lieblingsfragen, um C ++ zu disqualifizieren Experten .
Natürlich bedeutet System („PAUSE“), eine Betriebssystem-Shell zu erstellen und einen „PAUSE“ -Befehl ausführen zu lassen.
Eigentlich ist das funktioniert nur unter Windows, wo es sich NICHT um ein Sicherheitsproblem handelt , da“ PAUSE „ein Shell-interner Befehl ist, der kein externes Programm aufruft (es sei denn, Ihre System-Shell ist selbst gehackt … aber als Sie ein anderes Problem haben)
Unter Windows ist es sogar kein großes „Leistungsproblem“: Das Image von CMD.EXE befindet sich mit ziemlicher Sicherheit bereits im RAM, das CMD-Datensegment ist recht klein und… na ja … Sie bitten zu PAUSE (nicht so schnell wie möglich zu laufen!)
Auf Systemen außer Windows , dies funktioniert nicht (möglicherweise gibt es keinen PAUSE-Befehl) und ist ein Sicherheitsleck (jemand ca. n Erstellen Sie ein PAUSE-Programm, um seine eigene Aufgabe anstelle Ihrer zu erledigen.
Wenn Sie also nicht auf Ihren eigenen Computer und Ihr eigenes Betriebssystem abzielen, ist dies nicht portabel und kann sogar gefährlich sein.
Aber das Problem wird jetzt zu „ was ist stattdessen zu tun?“
Es ist fantastisch zu sehen, wie die meisten davon Die Antwort lautet… FALSCH , weil … sie nicht funktionieren können!
Mal sehen, warum:
Ihr Programm cin
-s zwei Ganzzahlen, einige Ergebnisse anzeigen und … muss es warten oder beenden?
Nehmen wir an Sie möchten warten: Wie antworten Sie auf die cin >> a
und cin >> b
?
Ihre Eingabe sieht aus wie
12\n
34\n
Sie MÜSSEN diese f eingeben. .ing kehrt zurück, da Sie den Konsoleneingabemodus verlassen müssen.
Jetzt verbraucht cin >> a
„12“. Die Rückgabe bleibt im Puffer.
cin >> b
belegt alle Leerzeichen (einschließlich Rückgaben) bis zum ersten Nicht-Leerzeichen als alle Ziffern. Es wird „\ n34“ verbrauchen (und b = 34 setzen).
Es gibt bis zu einer endgültigen Rückkehr im Eingabepuffer. Nun wollen wir sehen, wie alle Experten FAIL!
-
cin.get()
verwenden: FALSCH : Dies liest ein Zeichen und fährt fort. Und es gibt ein Zeichen im Eingabepuffer, also wird es nicht angehalten ! - Verwenden Sie
cin.ignore()
: FALSCH: Es gibt immer noch diese Rückgabe im Puffer. Sie ignorieren es … und gehen weiter. Keine Pause .
Wie sollten Sie es also machen?
In diesem Beispiel Sie müssen alles ignorieren, was sich bis einschließlich der Rückgabe im Puffer befindet, und dann um etwas anderes bitten, das Sie ignorieren können:
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 ist… alles, was größer ist als die Zeichen, die Sie eingeben können die Konsole, bevor Sie die Eingabetaste drücken.
Der Standardweg zum Abrufen dieser Nummer ist
numeric\_limits
(don t vergiss #include
)
Also am Ende …
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
cin.get();
}
wird Seien Sie eine richtige Pause -Funktion.
Aber jetzt sagen Sie mir:
Was ist, wenn jemand
12abcd\n
??
Der erste Lesevorgang zeigt“ 12 „und der zweite“ a … „und schlägt fehl (keine Ziffer!). B wird überhaupt nicht gelesen.
Dann löscht pause()
das „fehlerhafte Bit“ und verwirft dann abcd\n
Lesen Sie „1“ und beenden Sie das Programm.
Moral : Wenn Sie Zahlen lesen, überprüfen Sie immer, ob der Lesevorgang nicht fehlgeschlagen ist, und verwerfen Sie eventuelle fehlerhafte Eingaben:
while(!(cin >> b))
{ cin.clear(); cin.ignore(numeric\_limits
Dies erfordert jedoch auch eine Verwaltung von Eingabeaufforderungen und so weiter … und führt zu weit vom eigentlichen Zweck weg.
Antwort
Es ist keine saubere Lösung. Einige Leute nennen es vielleicht „Hack“, andere nennen es „Workaround“.
Sie sehen, eine der netten Eigenschaften der C-Sprache ist ihre Portabilität . Und mit der Systemsyntax („PAUSE“) verlieren Sie diese Portabilität, da dies von der Konsole abhängt, mit der Sie Ihr Programm ausführen.
Welche Alternativen gibt es nun? Leider gibt es keine perfekt saubere Lösung. Ich habe Leute gesehen, die diese Syntax verwenden.
std::cout << “Press any key to continue…”;
std::cin >> Some\_variable\_you\_declared\_in\_advance;
Grundsätzlich ist dies nur ein weiterer Hack, bei dem Ihr Programm mithilfe von Stream angehalten wird. Auf diese Weise verlieren Sie jedoch nicht Ihre Portabilität.
Eine der saubersten Lösungen, die ich kenne, ist diese (aber sie ist sehr geschmacksabhängig):
void pause () {
std::cin.ignore();
}
Auf diese Weise können Sie Ihre eigene Pausenfunktion verwenden . Es liest im Grunde ein Zeichen und ignoriert es, genau das, was Sie erreichen möchten. Aber wie gesagt, es ist sicherlich nicht die beste Lösung, nur mein persönlicher Favorit.