c-当我用管道将stdout发送到我的程序时出现分段错误



我不知道是否必须再说一遍,但英语不是我的母语,我不是一个很好的学生,我看到你能纠正我的信息,所以很好,但我想再次道歉。

这是一个交易,我有一个程序,它将参数中传递的给定图形转换为Dimacs格式,并将其存储在.cnf文件中。(我们用SAT求解器来求解)

当我自己使用它时,他工作得很好,所以我想有另一个程序,graph_generator,我会把它管道到我的程序中,以获得随机图形。

我已经制作了我的graph_generator程序,他以我想要的格式正确地打印了图表,所以我基本上已经尝试过了/graph_generator|/myprogram,但我立即出现分段错误,我不明白为什么,graph_generator返回的正是它所期望的,当我想使用调试器时,我不知道如何知道我通过管道传输结果,当我复制粘贴graph_generatormyprogram的结果时,我正确地生成了我的.cnf文件。

我不知道问题可能来自哪里,我有一个理论,但它有点站不住脚,那就是graph_generator的stdout,一旦管道化了我的程序,就会将空间视为一个参数,这就是问题所在。有人能帮我吗?

int main (int argc, char* argv[]){
  graph* mygraph;
  int taille, nbEdge;
  int i;
  FILE* resultat;

  printf("mark 1");
  taille = atoi(argv[1]);
  nbEdge = atoi(argv[2]);
  printf("mark 2");
  mygraph = build_empty_graph(taille);
  for(i = 3; i < argc; i+= 2)
    add_edge(atoi(argv[i]), atoi(argv[i+1]), mygraph);
  resultat = fopen("resultat.cnf", "w");
  write_result_comments(resultat);
  write_result_header(resultat, mygraph);
  write_first_stack(resultat, mygraph);
  write_second_stack(resultat, mygraph);
  fclose(resultat);
  return 0;
}

这是myprogram的主要部分,当我将其与管道一起使用时,消息"mark1"甚至不会出现

这是分段故障,因为您没有检查argc,也没有传递任何值作为参数。请注意,stdin是一个独立于argv中参数的流。

解决这个问题的最佳方法是分层构建:

tokenizer:使用getchar在循环中读取stdin,直到到达空白(空格、制表符或换行符)。

parser:atoi很好,因为您只传递int。

状态机:前两个args到taille和nbEdge,其余成对(x,y)调用程序。也许在循环中使用switch语句和状态变量。

程序:程序的其余部分基本上是原样的。

相关内容

最新更新