La mejor respuesta
Esta es una de mis preguntas favoritas para descalificar C ++ expertos .
Por supuesto, sistema («PAUSA») significa crear un shell del sistema operativo y dejar que ejecute un comando «PAUSA».
En realidad, eso funciona solo en Windows, donde NO es un problema de seguridad , ya que» PAUSE «es un comando interno del shell que no invoca ningún programa externo (a menos que el shell del sistema esté pirateado … pero que tienes otro problema)
En Windows ni siquiera es un gran «problema de rendimiento»: la imagen de CMD.EXE casi seguramente ya está en la RAM, el segmento de datos de CMD es bastante pequeño y … bueno … estás pidiendo PAUSAR (¡no correr tan rápido como puedas!)
En sistemas que no sean Windows , esto no funcionará (puede que no haya un comando PAUSE) y es una fuga de seguridad (alguien ca n crear un programa de PAUSA para hacer su propia tarea en lugar de la suya).
Por lo tanto, a menos que esté apuntando a su única máquina y su único sistema operativo, eso no será portátil y puede ser incluso peligroso.
Pero el problema ahora se convierte en “ ¿qué hacer en su lugar?”
Es fantástico ver cómo la mayoría de La respuesta es… INCORRECTA , porque… ¡no pueden funcionar!
Veamos por qué:
Su programa cin
-s dos enteros, muestra algunos resultados y … ¿debe esperar o salir?
Supongamos quiere esperar: ¿cómo responde a las cin >> a
y cin >> b
?
Su entrada se verá como
12\n
34\n
DEBE escribir esos f. .ing regresa, porque necesita salir del modo de entrada de la consola.
Ahora, cin >> a
consumirá “12”. La devolución permanecerá en el búfer.
cin >> b
consumirá todos los espacios (incluye devoluciones) hasta el primer no espacio, que todos los dígitos. Consumirá “\ n34” (y establecerá b = 34).
Hay hasta un f… ing retorno en el búfer de entrada. Así que ahora veamos cómo todos los expertos ¡FALLAN!
- usan
cin.get()
: INCORRECTO : Esto leerá un carácter y continuará. Y hay un carácter en el búfer de entrada, así que ¡no se detendrá ! - use
cin.ignore()
: INCORRECTO: Todavía hay ese maldito retorno en el búfer. Lo ignoras … y vas más allá. Sin pausa .
Entonces, ¿cómo debería hacerlo?
En esta muestra en particular, tiene que ignorar todo lo que está en el búfer hasta la devolución incluida, luego pedir algo más para ignorar:
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, es … algo más grande que los caracteres en los que puede escribir la consola antes de presionar Enter.
La forma estándar de obtener este número es
numeric\_limits
(don No olvide #include
)
Entonces, al final…
void pause()
{
cin.clear();
cin.ignore(numeric\_limits
cin.get();
}
ser una función adecuada pause .
Pero ahora dime:
¿Qué pasa si alguien escribe
12abcd\n
??
La primera lectura verá“ 12 ”y la segunda“ a… ”y fallará (¡ni un dígito!). B no se lee en absoluto.
Entonces pause()
borrará el «bit malo» y descartará abcd\n
, luego lea “1” y salga felizmente.
Moral : cuando lea números, siempre verifique que la lectura no haya fallado y descarte cualquier entrada incorrecta:
while(!(cin >> b))
{ cin.clear(); cin.ignore(numeric\_limits
Pero esto también requiere gestión de indicaciones y demás … y conduce demasiado lejos del propósito real.
Respuesta
No es una solución limpia. Algunas personas pueden llamarlo «pirateo», algunas personas pueden llamarlo «solución alternativa».
Verá, una de las buenas propiedades del lenguaje C es su portabilidad . Y con la sintaxis del sistema (“PAUSA”), está perdiendo esta portabilidad, porque depende de la consola que esté usando para ejecutar su programa.
Ahora, ¿cuáles son las alternativas? Lamentablemente, no existe una solución perfectamente limpia. He visto personas que utilizan esta sintaxis
std::cout << “Press any key to continue…”;
std::cin >> Some\_variable\_you\_declared\_in\_advance;
Básicamente, este es solo otro truco, usando la transmisión para pausar su programa. Pero no está perdiendo su portabilidad de esta manera.
Una de las soluciones más limpias que conozco es esta (pero depende mucho del sabor):
void pause () {
std::cin.ignore();
}
De esta manera, puede usar su propia función de pausa . Básicamente lee un carácter y lo ignora, que es exactamente lo que quieres lograr. Pero como dije, ciertamente no es la mejor solución, solo mi favorita personal.