-1

大きなテキスト ファイルから単語を推測するプログラムを作成しています。1 つのステップは、ストリングの長さを判別するためにユーザー入力を取得することです。

編集:完全なコードを追加し、いくつかの変更を加えました

#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」部分に到達してユーザー入力の長さを読み取るたびに発生することです。任意の数字を入力してエンターを押しても何も起こりません。プログラムはまだ実行されており、無期限に入力を受け取り続けています。何か助けはありますか?別の関数ではありますが、プログラムの早い段階で ifstream を使用することと関係がありますか?

4

1 に答える 1

1

に無限ループがありselectlength()ます。ループ内で (ループ カウンター) をデクリメントしているため、外側のforループは終了しません(良い考えではありません。おそらくもっと良い方法を見つけてください)。i

入力ファイルの最後の行で終了していないと思います。両方とも真であり、到達することはありませんlonger。ループでこれをテストします。shorterlimit

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

これにより、少なくとも無限ループが停止し、ロジックを再確認できるようになります (何に使用されるかは明確ではありませlongershorter

いくつかの一般的なコメント:

  1. 問題領域内にトレース ステートメントを配置すると、問題を特定するのに役立ちます。
  2. char words[x][y]の代わりに使用すると、C++ についてさらに学ぶことができます。std::vector<std::string> words;
  3. ステートメント内のブール値は、次のifように読む方が簡単if (longer || shorter)です。
  4. あなたは常に 0 を返しています - むしろ関数を作成してvoidください。

counterまた、内部でグローバルを 0 に設定してselectlength()いますが、後で必要になるprintresults()ため、出力が得られません。

于 2012-06-30T20:05:49.850 に答える