簡體   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