我不知道我是否必须再说一遍,但英语不是我的母语而且我不是一个好学生,我已经看到你能够纠正我的信息所以很好,但我想再次道歉。
这是交易,我有一个程序,它将参数中传递的给定图形转换为我将存储在.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;甚至不会出现
答案 0 :(得分:1)
这是segfaulting,因为你没有检查argc并且没有传递任何值作为参数。 请注意,stdin是与argv中参数的单独流。
解决此问题的最佳方法是按层次结构进行构建:
tokenizer:使用getchar在循环中读取stdin,直到得到空格(空格,制表符或换行符)。
解析器:atoi很好,因为你只传递了int。
状态机:前两个args to taille和nbEdge,成对休息(x,y)来调用程序。也许在循环中使用switch语句和状态变量。
程序:你的程序的其余部分就是这样。