que - ignore c++ ejemplos
¿Cuándo y por qué necesito usar cin.ignore() en C++? (5)
Cuando desee eliminar manualmente un número específico de caracteres de la secuencia de entrada.
Un caso de uso muy común es usar esto para ignorar de manera segura los caracteres de nueva línea, ya que a veces cin dejará caracteres de nueva línea que tendrá que pasar para llegar a la siguiente línea de entrada.
Para resumir, le da flexibilidad al manejar la entrada de la secuencia.
Escribí un programa muy básico en C ++ que pedía al usuario ingresar un número y luego una cadena. Para mi sorpresa, al ejecutar el programa nunca se detuvo para pedir la cadena. Simplemente se saltó sobre eso. Después de leer un poco sobre StackOverflow, descubrí que necesitaba agregar una línea que dijera:
cin.ignore(256, ''/n'');
antes de la línea que recibe la entrada de cadena. Agregar eso solucionó el problema e hizo que el programa funcionara. Mi pregunta es por qué C ++ necesita esta línea cin.ignore()
y cómo puedo predecir cuándo necesitaré usar cin.ignore()
?
Aquí está el programa que escribí:
#include <iostream>
#include <string>
using namespace std;
int main()
{
double num;
string mystr;
cout << "Please enter a number: " << "/n";
cin >> num;
cout << "Your number is: " << num << "/n";
cin.ignore(256, ''/n''); // Why do I need this line?
cout << "Please enter your name: /n";
getline (cin, mystr);
cout << "So your name is " << mystr << "?/n";
cout << "Have a nice day. /n";
}
Es mejor usar scanf ("% [^ / n]", str) en c ++ que cin.ignore () después de la declaración cin >>. Para hacer eso primero, debe incluir el encabezado <cstdio>.
Estás pensando en esto de la manera incorrecta. Estás pensando en pasos lógicos cada vez que cin
o getline
. Ex. Primero pida un número y luego pida un nombre. Esa es la manera incorrecta de pensar en cin
. Entonces te encuentras con una condición de carrera porque asumes que la transmisión está clara cada vez que pides una entrada.
Si escribe su programa solo como entrada, encontrará el problema:
void main(void)
{
double num;
string mystr;
cin >> num;
getline(cin, mystr);
cout << "num=" << num << ",mystr=/'" << mystr << "/'" << endl;
}
En lo anterior, estás pensando, "primero obtén un número". Entonces, escribe 123
presiona enter, y tu resultado será num=123,mystr=''''
. ¿Porqué es eso? Es porque en la transmisión tiene 123/n
y 123
se analiza en la variable num
mientras /n
todavía está en la transmisión. Al leer el documento para la función getline
de forma predeterminada, se verá en istream
hasta que se encuentre /n
. En este ejemplo, como /n
está en la transmisión, parece que se "saltó" pero funcionó correctamente.
Para que lo anterior funcione, deberá ingresar 123Hello World
que arrojará correctamente num=123,mystr=''Hello World''
. Eso, o pones un cin.ignore
entre el cin
y getline
para que se rompa en los pasos lógicos que esperas.
Es por eso que necesita el comando de ignore
. Porque estás pensando en ello en pasos lógicos y no en forma de secuencia, por lo que te encuentras en una condición de carrera.
Tome otro ejemplo de código que se encuentra comúnmente en las escuelas:
void main(void)
{
int age;
string firstName;
string lastName;
cout << "First name: ";
cin >> firstName;
cout << "Last name: ";
cin >> lastName;
cout << "Age: ";
cin >> age;
cout << "Hello " << firstName << " " << lastName << "! You are " << age << " years old!" << endl;
}
Lo anterior parece ser en pasos lógicos. Primero pregunte por nombre, apellido y edad. Entonces, si ingresó a John
, luego ingrese Doe
, luego ingrese 19
, la aplicación funciona en cada paso lógico. Si lo piensas en "transmisiones", simplemente puedes ingresar " John Doe 19
en la pregunta "Primer nombre:", y funcionaría igual y parecería omitir las preguntas restantes. Para que lo anterior funcione en pasos lógicos, necesitaría ignore
el flujo restante para cada salto lógico en las preguntas.
Solo recuerde pensar en la entrada de su programa, ya que está leyendo de una "secuencia" y no en pasos lógicos. Cada vez que llamas a cin
lo estás leyendo de una transmisión. Esto crea una aplicación bastante defectuosa si el usuario ingresa la entrada incorrecta. Por ejemplo, si ingresó un personaje donde se espera un cin >> double
, la aplicación producirá un resultado bastante (aparentemente) extraño.
Ignorar es exactamente lo que su nombre implica.
No "arroja" algo que no necesita, sino que ignora la cantidad de caracteres que especifica cuando lo llama, hasta el carácter que especifique como punto de interrupción.
Funciona con búferes de entrada y salida.
Esencialmente, para las sentencias std::cin
se usa ignorar antes de hacer una llamada a getline
, porque cuando un usuario ingresa algo con std::cin
, presionan enter y un ''/n''
char ingresa al buffer cin
. Luego, si usas getline
, obtiene la nueva línea char en lugar de la cadena que deseas. Por lo tanto, debe hacer std::cin.ignore(1000,''/n'')
y eso debería borrar el búfer hasta la cadena que desee. (El 1000 se coloca allí para omitir una cantidad específica de caracteres antes del punto de corte especificado, en este caso, el carácter de / n nueva línea).
La función Ignorar se usa para omitir (descartar / descartar) los caracteres en la secuencia de entrada. Ignorar archivo está asociado con el archivo istream. Considere la siguiente función ex: cin.ignore (120, ''/ n''); la función particular omite el siguiente carácter de entrada 120 o para omitir los caracteres hasta que se lea un carácter de nueva línea.