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;
}
}
这里&#34; test.txt&#34;文件包含这样的数据
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。我尝试了一些其他数据,但仍然是输出中无法看到的最后一个节点 如果有人帮助我,那将是伟大的。
答案 0 :(得分:2)
vector<int>adj[N+1]; //change this line also
for( int i = 1 ; i <= 5; i++ ) // Printing graph
更改此行。
答案 1 :(得分:2)
该行
adj[u].push_back(v);
当u
为5时,使用越界索引访问内存。这是未定义行为的原因。它必须是:
adj[u-1].push_back(v);
当行中的数字后面有空格字符时,代码也会出现解析错误。您可以使用strtok
来避免使用std::istringstream
解析一行的陷阱。这是我的建议:
#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;
}
}
}
答案 2 :(得分:1)
R Sahu有正确答案,你有一个一个错误。
我想补充一点,你应该使用c ++功能来避免这种错误。
因此,将vector<int> adj[N];
替换为vector<vector<int>> adj;
或array<vector<int>>
。
然后你可以使用at来访问你的数据(通过ref)并捕获一个很好的运行时错误来检测你的缺陷。