1

私は、スペースで区切られた入力(<= 10)に続いて、CPP の 2 つの別々の配列の次の行にスペースで区切られた入力の他のセットを取得する必要があるという問題に取り組んでいます。これには cpp で getline 関数を使用しています。私が直面している問題は、入力を取得する最後の行です。私が直面している問題がわかりません。最後の行が来ると、出力が停止し、何かを入力するのを待ってから、出力を配信します。私のコード..

while(test--)
{

    int len[100];
    int pos[100];


    string a,b,code;
        // int t=1;


    cin>>code;


    cin.ignore();//ignores the next cin and waits till a is not input


    getline(cin,a);


  //  deque<char> code1;

   // code1.assign(code.begin(),code.end());




    int k=0;
    int t=a.length();
    for(int i=0;i<t/2+1;i++)//converts two n length arrays pos[] and len[] 
    {

        scanf("%d",&len[i]);

    while(a[k]==' ')
    {
        k++;

    }




            pos[i]=a[k]-48;
            k++;
               }



        //int c;}

`

4

1 に答える 1

1

あなたのコードは紛らわしく、うまくいくようには見えません。cin/scanf でブロッキング入力を使用しているため、標準入力に入力の準備ができていない場合、ブロックが待機するのは正常です。

これは、あなたがやろうとしていたように見えるものです:

  • a行をusingという文字列に読み込みgetlineます。
  • aを使用して配列にデータを読み取りますscanf

ただし、scanfこのために作成されたものではありません。scanf関数はキーボードから入力を取得します。sscanfを使用して string から値を入力したかったと思いますa

しかし、さらに良いのはstringstreamsを使用することです。

最初は、コマンド ラインから入力の長さを読み取ろうとしていると思ったので、次のように提案しました。

size_t arr_len;

cin >> arr_len;

if (cin.fail())
{
    cerr << "Input error getting length" << endl;
    exit(1);
}

int* len = new int[arr_len];
int* pos = new int[arr_len];

for (int count = 0; count < arr_len; count++)
{
    cin >> len[count];

    if (cin.fail())
    {
        cerr << "Input error on value number " << count << " of len" << endl;
        exit(1);
    }        
}


for (int count = 0; count < arr_len; count++)
{
    cin >> pos[count];

    if (cin.fail())
    {
        cerr << "Input error on value number " << count  << " of pos" << endl;
        exit(1);
    }
}

delete [] pos;
delete [] len;

それから私はもっと注意深く見ました。これがあなたのやりたかったことのようです。std::vectorの代わりにを使用してint[]いますが、どうしても変更したい場合は難しくありません。

string line;

getline(cin, line);

if (cin.fail())
{
    cout << "Failure reading first line" << endl;
    exit(1);
}

istringstream iss;

iss.str(line);

vector<int> len;

size_t elements = 0;

while (!iss.eof())
{
    int num;
    iss >> num;

    elements++;

    if (iss.fail())
    {
        cerr << "Error reading element number " << elements << " in len array" << endl;
    }

    len.push_back(num);
}

getline(cin, line);

if (cin.fail())
{
    cout << "Failure reading second line" << endl;
    exit(1);
}

iss.clear();
iss.str(line);

vector<int> pos;

elements = 0;

while (!iss.eof())
{
    int num;
    iss >> num;

    elements++;

    if (iss.fail())
    {
        cerr << "Error reading element number " << elements << " in pos array" << endl;
    }

    pos.push_back(num);
}
于 2012-10-13T13:42:25.223 に答える