【问题标题】:why loop is skipping input in first iteration? [duplicate]为什么循环在第一次迭代中跳过输入? [复制]
【发布时间】:2020-11-14 00:04:49
【问题描述】:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

主函数

int main(){
    long long int T;
    string s;
    cin >> T;
    while(T--){
        getline(cin, s);
        cout << s << endl;
    }
}

while 循环在第一次迭代时跳过输入 只打印空行

我想在每次迭代时传递字符串作为输入,但在第一次迭代时,循环跳过输入行。

【问题讨论】:

  • 问题是当你使用 cin>>T 时,它会留下一个换行符并且被 getline() 读取。更多详情请参考this

标签: c++ string while-loop cin getline


【解决方案1】:

您需要使用std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');,因为它会忽略直到"\n"EOF 之前的其余行。

现在std::numeric_limits&lt;std::streamsize&gt;::max() 基本上是在告诉cin 可以忽略的字符数没有限制。

此外,使用for 循环可能更有意义。

例如:

#include <iostream>
#include <string>

int main()
{
    long long int T;
    std::cin >> T;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    for (int i = 0; i < T; i--)
    {
        std::string s;
        std::getline (std::cin, s);
        std::cout << s << std::endl;
    }


    return 0;
}

还可以看看为什么你不应该使用using namespace std;

【讨论】:

    【解决方案2】:

    cin &gt;&gt; T 读取到数字的末尾而不是行尾。

    因此,对于第一个 getline(cin, s);,您可以阅读数字后面的其余部分。

    您可以在cin &gt;&gt; T; 之后调用cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n'); 以忽略该行中剩余的所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多