[英]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
讀取新行,而不是讀取N
和E
后剩下的任何內容。
你可以這樣做:
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.