Was sind die Nachteile der Systempause?


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!

  1. cin.get() verwenden: FALSCH : Dies liest ein Zeichen und fährt fort. Und es gibt ein Zeichen im Eingabepuffer, also wird es nicht angehalten !
  2. 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::max()

(don t vergiss #include )

Also am Ende …

void pause()

{

cin.clear();

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

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::max(),’\n’); }

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.