el programa no puede pasar de "cin"

Estoy escribiendo un programa que adivinará palabras tomadas de un gran archivo de texto. Un paso es tomar la entrada del usuario para determinar la longitud de la cadena.

editar: se agregó el código completo, se hicieron algunos cambios

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int i(0),n(0),counter(0),limit(0);
char words[60000][30];

int initarray() {

 int length(0);
 string line;
 char temp;

 ifstream wordlist ("text.txt");

 if (wordlist.is_open())
 {
     while (wordlist.good())
     {
         getline (wordlist,line);
         length=line.length();

         for (n=0;n!=length;n++)
         {
             temp=line.at(n);
             words[i][n]=temp;
         }
         i++;
         counter++;
     }
 }
 else
 {
    cout<<"file not opened";
 }
 wordlist.close();
 return 0;
}

int selectlength()
{
 int length;
 bool shorter(false),longer(false);

 cout <<"length of word"<<endl;
 cin >> length

 limit=counter;
 counter=0;

 for (i=0;i<limit;i++){

    for (n=0;n!=length;n++){
        if (words[i][n]=='\0')
        {
            shorter=true;
            break;
        }
    }

    if (words[i][length+1] != '\0')
    {
        longer=true;
    }

    if (longer==true || shorter==true)
    {
        i--;
     }
 }
    return 0;
}


int printresults(){
 for (i=0;i!=counter;i++){
     for (n=0;n<=20;n++){
         cout << words[i][n];
     }
     cout <<endl;
 }
 return 0;
}

int main() {
 initarray();
 selectlength();
     printresults();
 return 0;

}

pero mi problema ocurre cada vez que el programa, que compila bien, llega a la parte "cin" para leer la entrada del usuario para la longitud. Cuando ingreso cualquier número y presiono enter, no sucede nada. El programa todavía se está ejecutando, y sigue tomando entradas indefinidamente. ¿Alguna ayuda? ¿Podría tener algo que ver con mi uso de ifstream anteriormente en el prigram, aunque en una función diferente?

preguntado el 30 de junio de 12 a las 19:06

El código anterior obviamente no es lo que está ejecutando o está incompleto: cin.get(length,). Pegue el código real o el caso de prueba. -

El uso correcto sería cin >> length. -

Esto todavía no puede ser el código real, no hay ; después de cin >> length parte. -

1 Respuestas

Tienes un bucle infinito en selectlength(). El exterior for el bucle no termina porque estás decrementando i (el contador de bucles) dentro del bucle (no es una buena idea, tal vez encuentre una mejor manera).

Creo que no está terminando en la última línea del archivo de entrada. longer y shorter ambos serán verdaderos y limit nunca será alcanzado. Poner en una prueba para esto en el ciclo:

if (words[i][0] == '\0')
    break;

Eso al menos detendrá el ciclo infinito y le permitirá revisar su lógica (no está claro qué longer y shorter se utilizará para.

Algunos comentarios generales:

  1. Poner declaraciones de seguimiento dentro del área del problema puede ayudarlo a identificar un problema.
  2. Aprenderá más sobre C++ si en lugar del char words[x][y] tu usas std::vector<std::string> words;
  3. Un booleano dentro de un if declaración es más fácil de leer así: if (longer || shorter) que como lo tienes.
  4. Siempre estás devolviendo 0, en lugar de hacer la función void.

También está configurando el global counter a 0 dentro selectlength() pero todavía lo necesita más tarde en printresults() por lo que no obtendrá ninguna salida.

Respondido el 30 de junio de 12 a las 21:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.