段错误 reading/altering 一个全局变量

Segfault reading/altering a global variable

我已经开始熟悉 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 时就是问题了 个是。