从输入文件打印图形


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 2Node 3

2 1 4 5     

上行(第二行(表示,Node 2连接到Node 1Node 4Node 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(并捕获一个很好的运行时错误来检测您的缺陷。

最新更新