繁体   English   中英

为什么getline()函数在这里没有读取任何内容?

[英]Why doesn't the getline() function read anything here?

对于输入,

1
4 2
1 2
1 3
1

该程序,

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;


int main() 
{
  int Q;
  cin >> Q;   //Q=2

  while(Q--)
  {
    int N, E;
    cin >> N >> E;  // N=4, E=2    

    while(1)
    {
      string edge;
      getline(cin,edge); //edge should store "1 2" for the first iteration and "1 3" for the second iteration.
      cout << edge << " " << edge.size() << endl;
      vector<int> adjList[N];

      if(edge.size()>1)
      {
        int u = stoi(edge.substr(0,1));
        int v = stoi(edge.substr(2,1));

        for(int i=0; i<E; ++i)
        {
          adjList[u].push_back(v);
          adjList[v].push_back(u);
        }
      }

      else
        break;
    }
  }

  return 0;
}

给出输出

0

该程序应打印出来,

1 2 3
1 3 3
1 1

为什么我没有在字符串边缘存储任何值? 我认为这是导致问题的getline()函数。 是否有其他函数可以将整行作为字符串(包括空格),直到达到换行符?

执行此语句后:

cin >> N >> E;  // N=4, E=2

输入流中的下一个内容是换行符,通过将int读入E消耗该换行符。 所以第一次调用getline(cin, edge)只是读取那个换行符,这是一个空字符串。

您需要从流中读取更多数据,以便第一次调用getline读取新行,而不是读取NE后剩下的任何内容。

你可以这样做:

cin >> N >> E;  // N=4, E=2
string dummy;
getline(cin, dummy);  // read rest of line

这将读取新行到虚拟变量,因此下一行将在下一行开始。

或者像这样:

cin >> N >> E;  // N=4, E=2
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

这将告诉cin流丢弃字符,直到:

  • 它已读取std::numeric_limits<std::streamsize>::max()字符(这是一个非常大的数字),或者
  • 它读取\\n字符(即下一个换行符)。

同样,这意味着下一行将从下一行开始。

由于您知道在读入E和换行符的值之间没有空格或其他数据,因此您不需要丢弃非常大量的字符,实际上可以使其更简单:

cin >> N >> E;  // N=4, E=2
cin.ignore(20, '\n');

这将丢弃最多20个字符,或下一个换行符,以先到者为准。

如果你完全确定换行前没有任何东西 ,你可以忽略一个字符:

cin >> N >> E;  // N=4, E=2
cin.ignore();  // discard a single character

这应该适用于你的情况,但是更脆弱,因为如果某人在你的输入文件中插入一个空格,事情就会再次停止工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM