2012-06-30 2 views
-1

Я пишу программу, которая будет угадывать слова, взятые из большого текстового файла. Один шаг - ввод данных пользователя для определения длины строки.программа не может пройти «cin»

изменения: добавлен полный код, сделал некоторые изменения

#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; 

} 

но моя проблема происходит, когда программа, которая отлично компилируется, попадает в «Cin» часть для чтения ввода пользователя для длины. Когда я вхожу в любое число и нажимаю Enter, ничего не происходит. Программа все еще работает и просто продолжает вводить данные неопределенно. Любая помощь? Может ли это иметь какое-либо отношение к моему использованию ifstream раньше в приграме, хотя и в другой функции?

+14

Вышеприведенный код, очевидно, либо не является тем, что вы используете, либо неполным: 'cin.get (length,)'. Вставьте фактический код или тестовый пример. – wilx

+1

[Не компилируется] (http://ideone.com/09dry) –

+0

Правильное использование будет 'cin >> length'. – chris

ответ

1

У вас есть бесконечный цикл в . Внешний цикл for не заканчивается, потому что вы уменьшаете i (счетчик циклов) внутри цикла (не очень хорошая идея, возможно, найти лучший способ).

Я думаю, что вы не завершаете последнюю строку во входном файле. longer и shorter оба будут истинными, и limit никогда не будет достигнуто. Помещенный в тесте для этого в цикле:.

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

Это будет по крайней мере, остановить бесконечный цикл и позволит вам пересмотреть положения, в вашей логике (это не ясно, что longer и shorter будет использоваться для

несколько общих замечаний:

  1. Ввод заявления трассировки в проблемной области может помочь вам определить проблему
  2. вы узнаете больше о C++, если вместо. 0 вы используете std::vector<std::string> words;
  3. Булевое выражение внутри выражения if легче читать следующим образом: if (longer || shorter), чем у вас есть.
  4. Вы всегда возвращаете 0 - скорее сделайте функцию void.

Вы также установка глобального counter до 0 внутри , но вам все еще нужно это позже в printresults(), так что вы не получите никакого вывода.

Смежные вопросы