2011-11-23 14 views
11

Esta es la primera vez que uso stackoverflow. No he podido encontrar la información que necesito con respecto a getline. Estoy en una clase de programación simple para las transferencias de ingeniería, por lo que el código que escribimos es bastante simple. Todo lo que estoy tratando de hacer aquí es poner un número definido por el usuario de preguntas y respuestas en dos matrices diferentes. Mi bucle while se parece a esto (yo estaba usando un bucle pero cambió a tiempo sólo para ver si iba a dejar de romper):¿Qué no entiendo acerca de getline + strings?

int main() 
{ 
    srand((unsigned)time(0)); 
    string quest1[100], answ1[100]; 
    int size1, x = 0, num, count1, visit[100], shuffle[100]; 
    fstream flashcard1; 

    cout << "flashcard.cpp by NAME\n" << endl; 
    cout << "This program allows user to manipulate questions and answers for studying.\n" << endl; 
    cout << "\nHow many flash cards will be entered(MAX 100)? "; 
    cin >> size1; 
    cout << endl; 

    while(x < size1) 
    { 
     cout << "Enter Question: "; 
     getline(cin , quest1[x]); 
     cout << endl; 
     x = x++; 

     /* 
     cout << "Enter Answer: " << endl; 
     getline(cin,answ1[x]); 
     cout << endl; 
     flashcard1.open("flashcard1.dat", ios::app); 
     flashcard1 << quest1[x] << " " << answ1[x] << endl; 
     flashcard1.close(); 
     cout << "Data Stored." << endl; 
     */ 
    } 
} 

Noté la respuesta introduciendo parte, así como los datos de ahorro en el archivo solo para la depuración. Cuando ejecuto el programa, se salta la línea de obtención para la primera pregunta, muestra el segundo ciclo de "Introducir pregunta" y la línea de obtención funciona para el resto de ellos. Entonces, si tengo un tamaño 1 de 5, el programa solo llena las posiciones de la matriz 1-4. Por favor ayuda. Este es un sencillo programa de tarjeta flash que hará lo mismo que si creara tarjetas de memoria para estudiarlas y mezclarlas.

+7

'x = x ++;' es Undefined Behavior. Debería ser 'x ++' (o '++ x', o' x + = 1', o 'x = x + 1', o' x - = -1' ....) –

+0

Eso es porque x ++ y ++ x ambos cambian x por su valor en/decrement por 1. Sin embargo, no se puede garantizar que la asignación suceda antes o después de esto, por lo que a x se le puede asignar el valor de x ++ antes de que ocurra el incremento o después de que ocurra (el el estándar simplemente no especifica esto). –

+4

+1 para una buena primera pregunta sobre SO. –

Respuesta

12

La razón por la que está apareciendo para omitir la primera iteración es porque cuando haces

cin >> size1; 

Introduce un número y pulsa la tecla Intro. cin lee el número entero y deja el carácter de nueva línea sin leer en el búfer, de modo que cuando llame al getline, es como si inmediatamente presionara la tecla Intro, y getline no lee nada (porque se detiene antes de leer el carácter de línea nueva), descarta el nueva línea, y pone la cadena vacía en quest1[0]. Y es por eso que el resto del getline s funciona "correctamente".

Agregue cin.ignore('\n') sobre su ciclo para deshacerse de la persistente '\n', y eso debería hacerlo funcionar, salvo que haya otros errores en su código.

Y no se olvide de cambiar x = x++ a solo x++ para evitar UB.

+0

¡gracias! ¡No he experimentado una comunidad tan útil en años! – Brent

+0

@Brent si respondió su pregunta, asegúrese de hacer clic en la marca de verificación que se encuentra al lado para marcarla como la respuesta a su pregunta. –

+0

Me disculpo.Estuve en clase antes y no pude editar mi programa, pero supuse que esta era la respuesta correcta. Cuando agregué en cin.ignore ('n) encima de mi ciclo, el programa simplemente nunca saca la primera instrucción cout dentro del ciclo, enfrecido, solo pulso enter media docena de veces – Brent