¿Cuándo y por qué necesito usar cin.ignore () en C ++?

Escribí un progtwig muy básico en C ++ que pedía al usuario ingresar un número y luego una cadena. Para mi sorpresa, al ejecutar el progtwig 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 progtwig 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 progtwig que escribí:

 #include  #include  using namespace std; int main() { double num; string mystr; cout << "Please enter a number: " <> 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"; } 

    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).

    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.

    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 progtwig 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 progtwig, 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.

    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.

    Es mejor usar scanf (“% [^ \ n]”, str) en c ++ que cin.ignore () después de la statement cin >>. Para hacer eso primero, debe incluir el encabezado .