2017-02-15 38 views
1

對於輸入,爲什麼getline()函數在這裏讀取任何內容?

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 

爲什麼我不是S顛倒字符串中的任何值邊緣?我認爲這是導致問題的功能getline()。是否還有其他函數可以將整行作爲一個字符串(包括空格),直到達到換行符爲止?

+0

如果您打算使用慣用的C++,您應該避免使用C標準庫頭文件(即'cstdio')。由於您已經在使用C +的'',對'cstdio'沒有太大的需求。 – Dai

回答

0

執行該語句之後:

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 

這應該爲你的情況下工作,但有一點更加脆弱,因爲如果有人在你的輸入文件中插入一個空格的東西將停止再次工作。

+0

是的,現在我明白了,流和緩衝區! –

相關問題