c - 当我将标准输出传输到程序时出现段错误

标签 c segmentation-fault pipe

我不知道是否需要再说一遍,但英语不是我的母语,而且我不是一个很好的学生,我看到你能够纠正我的信息,所以没关系,但我'我想再次道歉。

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

当我自己使用它时,他工作得很好,所以我想要另一个程序,graph_generator,我将通过管道将其输入到我的程序中以获得随机图形。

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

我不知道问题出在哪里,我有一个理论,但它有点蹩脚,那就是 graph_generator 的标准输出,一旦通过管道传输,我的程序就会将空间视为参数,并且存在问题。有人可以帮我吗?

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

这是我的程序的主要部分,当我将它与管道一起使用时,消息“mark1”甚至没有出现

最佳答案

这是段错误,因为您没有检查 argc 并且没有传递任何值作为参数。 请注意,stdin 是与 argv 中的参数分开的流。

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

分词器:使用 getchar 循环读取 stdin,直到到达空格(空格、制表符或换行符)。

解析器:atoi 很好,因为你只传递整数。

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

程序:程序的其余部分几乎保持原样。

关于c - 当我将标准输出传输到程序时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26700631/

相关文章:

c - 如何将数组字符放入方程中?

python - 是什么导致 Python 段错误?

python - 程序退出结束时 pyobjc 和 wx 崩溃

console - 将错误流重定向到 Windows 中的文件和控制台

c - 在C中的不同文件中获取标准输出和错误输出

C程序基本计算器

c - 在不使用占位符的情况下在 C 中使用汇编器

c - 使用 Open-MP 的多核进行并行计算。

python - 如何在Python中通过两个链式管道传输变量的内容?

c - 向结构添加元素时出现段错误