あなたのコードは紛らわしく、うまくいくようには見えません。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);
}