int main()
{
char line[100];
int N = 5;
vector<int>adj[N];
FILE *in = fopen("test.txt", "r");
for (int i = 1; i <= N; i++)
{
fgets(line, 100, in);
char *pch = strtok(line, "t n");
int u = atoi(pch);
pch = strtok(NULL, "t n");
while (pch != NULL)
{
int v = atoi(pch);
adj[u].push_back(v);
pch = strtok(NULL, "t n");
}
}
for( int i = 0 ; i < 5; i++ ) // Printing graph
{
for( int p = 0 ; p < adj[i].size(); p++ )
{
cout<< i << " , "<< adj[i][p]<<endl;
}
}
这里的"test.txt"文件包含这样的数据
1 2 3
2 1 4 5
3 1
4 2
5 2
第一列包含顶点 ( 1 - 5 (
1 2 3
上行(第一行(表示,Node 1
连接到Node 2
和Node 3
2 1 4 5
上行(第二行(表示,Node 2
连接到Node 1
、Node 4
和Node 5
我想以图表形式读取此数据。然后需要打印图形。
我期待输出如下
1,2
1,3
2,1
2,4
2,5
3,1
4,2
5,2 // not getting in output
但是我没有在输出中获取节点 5。我尝试了一些其他数据,但仍然无法在输出中看到最后一个节点。
如果有人帮助我,那就太好了。
行
adj[u].push_back(v);
当 u
为 5 时,使用越界索引访问内存。这是导致未定义行为的原因。它需要:
adj[u-1].push_back(v);
当一行中的数字后面有空格字符时,代码也存在解析错误。通过使用 std::istringstream
来避免使用 strtok
解析行的陷阱。这是我的建议:
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <cstdlib>
using namespace std;
int main()
{
const int N = 5;
vector<int> adj[N];
std::ifstream infile("socc.in");
std::string line;
int i = 0;
while ( i < N && getline(infile, line) )
{
std::istringstream str(line);
int u;
str >> u;
if ( u > N )
{
// Problem.
abort();
}
int v;
while ( str >> v )
{
adj[u-1].push_back(v);
}
++i;
}
for( int i = 0 ; i < N; i++ ) // Printing graph
{
for( size_t p = 0 ; p < adj[i].size(); p++ )
{
cout<< i << " , "<< adj[i][p]<<endl;
}
}
}
vector<int>adj[N+1]; //change this line also
for( int i = 1 ; i <= 5; i++ ) // Printing graph
更改此行。
R Sahu 有正确的答案,你有一个错误。
我想补充一点,你应该使用 c++ 功能来避免这种错误。因此,将您的vector<int> adj[N];
替换为 vector<vector<int>> adj;
或 array<vector<int>>
.
然后,您可以使用 at 访问您的数据(通过 ref(并捕获一个很好的运行时错误来检测您的缺陷。