C语言 读取/修改全局变量的段错误



我已经开始熟悉getopt()以及如何使用它。现在我正在克隆一个猫,camt,来教自己一些东西,其中包括在执行时设置标志。

我的解决方案是在我的camt.h中设置全局变量,并根据我想要设置的标志来更改它们。它看起来像这样:

camt.c中的代码是:

bool line_numbers = false;
int main(int argc, char *argv[]){
int opt = 0;
while((opt = getopt(argc, argv,  "n")) != -1){
switch(opt){
case 'n':
line_numbers = true;
break;
default:
break;
}
}
int ch;
FILE* foofile;
int o_files = 1;
do{
//read file
foofile = fopen(argv[o_files], "r");
if(line_numbers){
display_ln(foofile); //line-numbers
}else{
display(foofile); /"normal" cat
}
fclose(foofile);
o_files++;
}while(o_files < argc);
printf("n"); //final scape character for nice prompt
return(EXIT_SUCCESS);
}
顺便说一句,如果没有一个更好的,不那么可怕的方法来设置程序中的标志,我会很惊讶,在这种情况下,如果你告诉我,我会很感激:)请考虑到我是一个初学者,几乎不能用git克隆一个存储库,所以请友好。

谢谢。

天哪,这是一个愚蠢的修复。我没有问题读取全局变量,但打开文件

问题是我将o_files默认为1,这是我用来知道我正在读取的文件的。当第一个参数是一个文件或者我设置了一个标志立即结束程序时,这不是问题,但是当我给出一个选项并运行整个程序时,这就不是问题了。

我总是默认第一个参数,就好像它是一个文件;程序正确地激活了p_flags.line_numbers标志,然后试图读取-n,参数1,就好像它是一个文件,显然不存在。

TL;DR:差不多,我把所有的参数都当作文件来读,然后试图打开它们,当所有的参数都是文件时,这不是问题,但当不是all时,就会出现问题。