我一直在研究一个问题,我需要在CPP中的两个独立数组中使用空格分隔输入(< = 10),接着是下一行中的其他空间分隔输入集。我在使用getline函数我面临的问题是接受输入的最后一行。我无法弄清楚我面临的问题。当最后一行出现时,输出停止并等待我键入内容,然后输出output.Here是我的代码..
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;}
`
答案 0 :(得分:1)
您的代码令人困惑,看起来不应该有效。您正在使用cin / scanf的阻塞输入,因此如果标准输入上没有输入就绪,它等待您是正常的。
这就是你想要做的事情:
a
将该行添加到名为getline
的字符串中。a
将数据从scanf
读入数组。但是,scanf
不适用于此。 scanf
函数从键盘输入。我想您想使用sscanf输入字符串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);
}