0

そのため、ユーザーが Ctrl + Z を入力してループを終了するのを待つ必要がある学校のプロジェクトがあります。教師は、これを行う最善の方法は、cin >> xまだ Ctrl + Z を入力していないかどうかを確認することであると述べました。少しテストを行ったり行ったりした後、問題が何であるかを理解できなかったので、コードの非常に単純なバージョンを作成して、修正できるかどうかを確認しました。本当に何も変わっていません。とにかく、ここに簡単なコードがあります:

#include "Proj_02.h";

vector<int> dog;
string entry = "";
int value = 0;

void main()
{
    Menu();
}

void Menu()
{
    do
    {
        //Ask the user to enter a number
        cout << "Enter a number: ";
        //Save the number to a vector
        do
        {
            cout << "k";
            getline(cin, entry);
            value = atoi(entry.c_str());
        }while(value == 0);

        while (cin >> value)
        {
            cout << "L";
            dog.push_back(value);
        }

    //when the user presses Ctrl + Z stop asking
    }while(cin >> entry);

    //Display all of the numbers
    for(int i = 0;i < dog.size();i++)
    {
        cout << dog.at(i) << endl;
    }

    system("PAUSE");
}

したがって、これが実行されると何が起こるかというと、入力が行われた後でも何かを行う前に、コードがさらに 2 つの値を入力するのを待つということです。私の推測では、ある種のバッファ干渉を引き起こしている間に何か関係があると思いますが、cin >> entryこれを修正する方法について確かなアイデアはありません。誰かがそれを助けることができれば、それは素晴らしいことです.

4

5 に答える 5

1

「何が問題なのかわからなかったので、非常に単純なバージョンのコードを作成しました」 - これは非常に合理的な決定であり、正しいことでしたが、作成したコードはまったく単純ではありません。

do {
    cout << "Enter a number: ";
    do {
        cout << "k";
        getline(cin, entry);
        value = atoi(entry.c_str());
    } while(value == 0);

    while (cin >> value) {
        cout << "L";
        dog.push_back(value);
    }
} while(cin >> entry);

実行時に がどのように機能するかをテストしたい場合はwhile (cin >> value)、次のことから始めてください。

while (cin >> value) {
    dog.push_back(value);
}

std::stringより複雑な解析が必要で、数値を実際に取得する前にすべての行をオブジェクトに読み込むことが理にかなっている場合は、次のようになります。

std::string line;
while (std::getline(std::cin, line)) {
    if (line.empty())
        ...
    ...
}
于 2013-09-07T08:51:47.303 に答える
0

次の簡単な例を考えてみましょう。Linux では ctrl-d を、Windows では ctrl-z を使用して cin を終了し、コードを続行するか、この場合も単に q を押すことができます。

#include <iostream>
#include <string>
#include <vector>

int main()
{
  std::vector<int> v;
  std::string buffer;
  while ((std::cin >> buffer) && (buffer != "q"))
    v.emplace_back(atoi(buffer.c_str()));

  for ( auto& i : v )
  {
    std::cout << i << " ";
  }
  std::cout << std::endl;
}
output:

12
13
177
205
q
12 13 177 205
于 2013-09-07T08:59:14.180 に答える