0

質問が言うように、何らかの理由で、私のプログラムは入力をフラッシュしたり、現時点では識別できない方法で変数を使用したりしていません。これは私がやらなければならなかったことを超えた宿題プロジェクトのためのものです、今私はプログラムが実際に機能することを望んでいます:P

発見を容易にするための詳細:

プログラムは、最初の実行時に問題なく実行されます。すべてのスローが機能し、適切な値(n> 0)のみが受け入れられ、バイナリに変換されます。

終了入力を入力するとすぐに、プログラムはループに入り、次のように再度終了を要求するだけです。

LinuxラップトップのNetbeansでこのプログラムを実行すると、終了値を入力した後にプログラムがクラッシュします。Windows上のVisualC++では、今説明したようにループに入ります。

コードでは、プログラムの再起動時にすべてのストリームをクリアし、すべての変数を新しく初期化しようとしましたが、役に立ちませんでした。私は自分の間違いを見ることができません。

私はエラーが主な機能のいずれかにあると信じています:

int main( void )
{
vector<int> store;
int terminate = 1;

do
{
    int    num   =  0;
    string input = "";

    if( cin.fail() )
    {
        cin.clear();
        cin.ignore( numeric_limits<streamsize>::max(), '\n' );
    }

    cout << "Please enter a natural number." << endl;
    readLine( input, num );

    cout << "\nThank you. Number is being processed..." << endl;
    workNum( num, store );

    line;
    cout << "Go again? 0 to terminate." << endl;
    cin >> terminate // No checking yet, just want it to work!

    cin.clear();
}while( terminate );

cin.get();
return 0;
}

または数値を読み取る関数で:

void readLine( string &input, int &num )
{
    int buf = 1;
    stringstream ss;
    vec_sz size;

    if( ss.fail() )
 {
        ss.clear();
     ss.ignore( numeric_limits<streamsize>::max(), '\n' );
 }

    if( getline( cin, input ) )
    {
       size = input.size();
       for( int loop = 0; loop < size; ++loop )
           if( isalpha( input[loop] ) )
               throw domain_error( "Invalid Input." );

    ss << input;
    ss >> buf;

    if( buf <= 0 )
        throw domain_error( "Invalid Input." );

    num = buf;

    ss.clear();
    }
}
4

2 に答える 2

2

を呼び出すとcin >> terminate、terminateの値が読み取られますが、入力ストリームではそれに続く改行が残ります。遅く呼び出すとgetline(cin, input)、改行まで読み取られます。つまり、空の文字列が取得されます。

次の後にこれを追加することにより、改行までのすべての文字を破棄できますcin >> terminate

cin.ignore(99, '\n');

operator >>または混合を避けてくださいgetline

于 2010-04-25T12:28:47.773 に答える
2

>>インタージェイが述べたように、それらとgetline演算子を混在させないでください。また、コードをクリアしたい場合は、次のように書き直すことができると思います。

int main() {
   while (true) {
      std::cout << "Please enter a natural number" << std::endl;
      int num;
      std::cin >> num;

      // Exception handling here can be done easily
      // like this
      // if (!(std::cin >> num) || num < 0)
      //    throw std::domain_error("TROLOLOLO");

      std::cout << "Thank you. Number is being processed..." << std::endl;
      //workNum(num, store) here

      std::cout << "Go again? 0 to terminate." << std::endl;

      int terminate;
      std::cin >> terminate;
      if (terminate == 0) break;
   }
}
于 2010-04-25T12:44:05.663 に答える