0
   #include <iostream>
    using namespace std;

    struct list
    {
        int data;
        list *next;
    };

    list *node, *tail = NULL, *head = NULL;
    void add2list();
    void extrem();

    int main()
    {
        add2list();
        extrem();

        return 0;
    }

    void add2list()
    {
        int input;
        cout << "Adding values to list :\n";
        cout << ">>";

        while(cin >> input)
        {
            node = new list;
            node->data = input;
            node->next = NULL;

            if (head == NULL)
            {
                head = node;
                tail = node;
            }
            else
             {
                tail->next = node;
                tail = node;
             }
        cout << ">>";
        }
    }

    void extrem()
    {
       int x, y;
       cin >> x >> y;
    }

このプログラムを実行すると、add2list関数のみが実行されます????

cin.clear()を追加しましたが、問題が解決しないのはなぜですか?

どうすればこれを解決できるかについて明確な説明をすることができます

cin.clear()オブジェクトの使用はいつ役に立ちますか?

すみません4私の悪い英語

4

2 に答える 2

2

ロジックが壊れています。両方ともcin >> input、ストリームからscin >> x >> yを抽出しようとします。ループが 中断intすると、ストリームからsを抽出できなくなります。エラーフラグをリセットしても、解析可能なデータがストリームに突然表示されることはありません。に読み込もうとすると、ループから抜けたのと同じ理由で再び失敗します。whileadd2listintx

入力の個別の部分を読み取るためのより良い方法を見つける必要があります。つまり、リストを作成するための方法と、さらにデータを読み取るための方法です。一般的なベースのアプローチ(経由std::getline)は良いスタートかもしれません、そしてあなたは「リストの作成」などのコマンドをとる単純なシェルを実装することができます。

于 2012-08-16T00:26:45.267 に答える
0

std::cin >> value失敗する理由は2つあります。

  1. std::cin終了に達しました(たとえば、使用しているシステムに応じて、Ctrl-DまたはCtrl-Zを使用します)
  2. 保留中の文字は、として解析できません。valueつまり、あなたの場合はとして解析できませんint。ただし、問題のある文字は抽出されません。

明らかに、最初の状況でできることは何もありません。標準の入力ストリームの最後に到達すると、それを拡張する方法はありません。したがって、文字などの無効な文字を入力したとしましょう。この手紙を読み込もうとするintと失敗し、std::ios_base::failbit設定されます。ストリームに対して何かを行う前に、必要なことを実行しますclear()。クリアしstd::ios_base::failbitたらignore()、次のキャラクターをクリアして、もう一度やり直してください。つまり、呼び出しの後に追加する場合は、add2list()問題のある文字が1つしかない場合は、次の2つの呼び出しで問題ありません(そうでない場合は、さらに多くの文字を無視する必要があります)。

std::cin.clear();
std::cin.ignore();
于 2012-08-16T00:49:34.893 に答える