当我将stdout传递给我的程序时出现分段错误

时间:2014-11-02 14:53:40

标签: c segmentation-fault pipe

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

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

当我自己使用它时,他的工作非常完美,所以我希望有另一个程序graph_generator,我会将这个程序输入到我的程序中,以便随机绘制。

我已经制作了我的graph_generator程序,他正确地以我想要的格式打印图形,所以我基本上都尝试过./graph_generator | ./myprogram但是我立即得到了一个分段错误,我无法理解为什么,graph_generator会准确地返回它预期的内容,当我想使用调试器时,我不知道它是怎么回事#&# 39;可能知道我管道结果,当我复制粘贴时,graph_generator myprogram的结果正确地生成了我的.cnf文件。

我不知道问题可能来自哪里,我有一个理论,但它有点蹩脚,这是图形生成器的标准输出,一旦用管道程序将空间视为一个参数而且有问题。有人可以帮我吗?

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的主要内容,当我将它与管道一起使用时,消息&#34; mark1&#34;甚至不会出现

1 个答案:

答案 0 :(得分:1)

这是segfaulting,因为你没有检查argc并且没有传递任何值作为参数。 请注意,stdin是与argv中参数的单独流。

解决此问题的最佳方法是按层次结构进行构建:

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

解析器:atoi很好,因为你只传递了int。

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

程序:你的程序的其余部分就是这样。