gpt4 book ai didi

c++ - 从输入文件打印图形

转载 作者:太空宇宙 更新时间:2023-11-04 16:01:29 27 4
gpt4 key购买 nike

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     

上一行(第一行)表示,节点 1 连接到 节点 2节点 3

2 1 4 5     

上一行(第 2 行)表示,节点 2 连接到 节点 1节点 4节点 5

我想以图表的形式读取这些数据。然后需要打印Graph。
我期待这样的输出

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;
}
}
}

关于c++ - 从输入文件打印图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43062267/

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