Quels sont les inconvénients de la mise en pause du système?


Meilleure réponse

Cest lune de mes questions préférées pour disqualifier C ++ experts .

Bien sûr, le système («PAUSE») signifie créer un shell OS et le laisser exécuter une commande «PAUSE».

En fait, ne fonctionne que sur Windows, où ce nest PAS un problème de sécurité , car » PAUSE « est une commande interne au shell qui nappelle aucun programme externe (à moins que votre shell système ne soit lui-même piraté … mais que vous avez un autre problème)

Sous Windows, ce nest même pas un gros « problème de performances »: limage de CMD.EXE est presque sûrement déjà en RAM, le segment de données CMD est assez petit et… enfin … Vous demandez à PAUSE (de ne pas courir aussi vite que possible!)

Sur les systèmes autres que Windows , cela ne fonctionnera pas (il se peut quil ny ait pas de commande PAUSE) et cest une fuite de sécurité (quelquun peut n créer un programme PAUSE pour faire sa propre tâche au lieu de la vôtre).

Donc, à moins que vous ne cibliez votre propre machine et votre propre système dexploitation, cela ne sera pas portable et peut même être dangereux.

Mais le problème devient maintenant «  que faire à la place? »

Cest fantastique de voir comment tirer le meilleur parti du La réponse est… FAUX , parce que… ils ne peuvent pas fonctionner!

Voyons pourquoi:

Votre programme cin -s deux entiers, montre quelques résultats et… doit-il attendre ou se terminer?

Supposons vous voulez attendre: comment répondez-vous aux cin >> a et cin >> b?

Votre entrée ressemblera à

12\n

34\n

vous DEVEZ taper ces f. .ing renvoie, car vous devez quitter le mode dentrée de la console.

Maintenant, cin >> a consommera « 12 ». Le retour restera dans le tampon.

cin >> b consommera tous les espaces (y compris les retours) jusquau premier non espace, que tous les chiffres. Il consommera «\ n34» (et définira b = 34).

Il y a un retour f… ing dans le tampon dentrée. Voyons maintenant comment tous les experts ÉCHOUENT!

  1. utilisent cin.get(): MAUVAIS : Cela lira un caractère et continuera. Et il y a un caractère dans le tampon dentrée, donc il ne sarrêtera pas !
  2. utilisez cin.ignore(): MAUVAIS: Il y a toujours ce f… ing retour dans le tampon. Vous lignorez… et allez plus loin. Pas de pause .

Alors, comment faire?

Dans cet exemple particulier, vous doivent ignorer tout ce qui se trouve dans le tampon jusquau retour inclus, puis demander quelque chose dautre à ignorer:

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, est… tout plus grand que les caractères sur lesquels vous pouvez taper la console avant dappuyer sur Entrée.

La méthode standard pour obtenir ce numéro est

numeric\_limits::max()

(don t oublier #include )

Donc, à la fin…

void pause()

{

cin.clear();

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

cin.get();

}

sera être une fonction pause appropriée.

Mais maintenant, dites-moi:

Et si quelquun tape

12abcd\n

??

La première lecture verra« 12 »et la seconde« a… »et échouera (pas un chiffre!). B nest pas lu du tout.

Than pause() effacera le « mauvais bit » et rejettera abcd\n, puis lisez «1» et quittez joyeusement.

Morale : lorsque vous lisez des nombres, vérifiez toujours que la lecture n’a pas échoué et supprimez les éventuelles mauvaises entrées:

while(!(cin >> b))

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

Mais cela nécessite également une gestion des invites et ainsi de suite… et conduit trop loin du but réel.

Réponse

Ce nest pas une solution propre. Certaines personnes peuvent lappeler «pirater», dautres peuvent lappeler «solution de contournement».

Vous voyez, lune des belles propriétés du langage C est son portabilité . Et avec la syntaxe système («PAUSE»), vous perdez cette portabilité, car cela dépend de la console que vous utilisez pour exécuter votre programme.

Maintenant, quelles sont les alternatives? Malheureusement, il n’existe pas de solution parfaitement propre. Jai vu des gens utiliser cette syntaxe

std::cout << “Press any key to continue…”;

std::cin >> Some\_variable\_you\_declared\_in\_advance;

Fondamentalement, ce nest quun autre hack, utilisant stream pour mettre votre programme en pause. Mais vous ne perdez pas votre portabilité de cette façon.

Lune des solutions les plus propres que je connaisse est celle-ci (mais elle dépend beaucoup du goût):

void pause () {

std::cin.ignore();

}

De cette façon, vous pouvez utiliser votre propre fonction de pause . Il lit fondamentalement un caractère et lignore, ce que vous voulez exactement. Mais comme je lai dit, ce nest certainement pas la meilleure solution, juste ma préférée.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *