即使循环断开(在命令行)中,读取输入序列也是如此

Input sequence is read even when loop breaks (in command line)

本文关键字:输入 读取 断开 循环 命令行      更新时间:2023-10-16

我该如何处理这个问题?

while(ntestcase--)
{
    int i, n, max;
    cin >> n;
    for(i = 0; i < n; i++)
    {
        cin >> a;
        if(a >= 2)
            max += 2;
        else
            break;
    }
    cout << "max=" << max << " n=" << n << " i=" << i << "n";
    if(i == n && max != 0)
        cout << max << "n";
    else
        cout << -1;
}

考虑输入

ntestcase=3
n=5
as a's
1 2 3 4 5

我对问题的基本推论是,这里将输入5 a,但是当遇到1时,循环断裂并给出输出。在同一输入2之后,下一个测试案例被认为是" N"A为3、4,然后输出n,然后n为5。

产生的输出有点像这样:

max=0 n=5 i=0
-1
max=4 n=2 i=2
4

如何解决此问题并将序列(例如:1 2 3 4 5)视为单个输入?

看来您对错误的分析是正确的。当您突破循环时,未读取输入while(ntestcase--)的当前迭代剩下了,是用作下一次迭代的输入。

如果我是我的所有这些代码可能会大不相同编写我自己的程序(一方面,我会避免使用相同的变量i来计算从输入中读取多少次a,其中有多少次是在第一个值之前读取了多少次,小于2),但是要继续以您已经选择的样式:

while(ntestcase--)的主体末端添加另一个for环路在不做其他事情的情况下消耗其余的迭代输入。从输入中消耗n - i值,然后,您将准备好进行while(ntestcase--)的下一次迭代。

例如,这可能会奏效:

int how_many_to_discard = n - i;
for (int j = 0; j < how_many_to_discard; ++j)
{
  cin >> a;
}

,或者如果您不想向任何可能想调试代码的人赠送太多线索,则循环可以是

for ( ; i < n; ++i)