gpt4 book ai didi

c++ - 为什么 getline() 函数在这里不读取任何内容?

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:12 26 4
gpt4 key购买 nike

对于输入,

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

为什么我没有在字符串 edge 中存储任何值?我认为是 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

这应该适用于您的情况,但有点脆弱,因为如果有人在您的输入文件中插入一个空格,事情将再次停止工作。

关于c++ - 为什么 getline() 函数在这里不读取任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42239756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com