使用命令行参数时出现分段错误

时间:2016-03-29 14:17:01

标签: c file-io command-line getopt

我试图通过命令行参数获取输入和输出文件名。我只是使用getopt(告诉我是否有更好的方法)我得到segmentation fault

我确信分段错误是由输入文件的名称引起的。当我从命令行获取输入文件的名称时,有些事情会出错。

这是我的代码:

int main (int argc, char **argv) {

    char const *inFile = NULL; //I think the error is here
                               //an inFile that doesn't exist
                               //would cause a segmentation fault
    char const *outFile = "outfile.txt";
    double val;
    int xFlg= 0;
    int c;
    char *rm; //I need this for strtod, but I can use atoi instead

    while ( (c = getopt (argc, argv, "xo")) != -1 ) {
        switch (c) {
            case 'x':
                val = strtod(optarg, &rm);
                xFlg = 1;
                break;
            case 'o':
                outFile = optarg;
                break;
            default:
                help(); //void function that prints help
                return EXIT_FAILURE;
        }
        rm=NULL;
    }
    inFile = *(argv + optind);

    fread code
    .
    .
    .
    call function
    .
    .
    .
    fwrite code
}

我确信我的freads和fwrits没有问题,因为如果我使用scanf取名为inFile和outFile,一切都运行正常,我不会得到分段错误。

我使用xflg的值来决定是否运行我的功能。 val是我的函数所用的值。

这是我的功能:

void xFunc (input1, input2, val, xFlg) {
    if (xFlg == 1) {
        function code
        .
        .
        .
    } else {
    return; //don't run the function if the user doesn't type -x
            //into command line.
            //I don't know if this is the proper way to do this.
    }
}

这就是我想要实现的目标:

./ run -x 3.14 -o outputfilename.txt inputfilename.txt

编辑:

如果我执行以下操作来获取输入文件名,则不会发生分段错误:

char inFile[100];
printf("Name of input file: \n");
scanf("%99s",somestring);

1 个答案:

答案 0 :(得分:2)

问题有两个:

char const *inFile = NULL;
......
inFile = *(argv + optind);

初始化const char*后,您无法为其指定其他值。因此,要解决此问题,您可以尝试以下方法之一:

.....
 char const * inFile = *(argv + optind);
.....

如果您不需要将inFile指针指向初始化点,那么这应该没问题。

OR

char inFile[20]; //whatever size you need
......
strcpy(inFile, *(argv + optind));

这样,如果需要,可以更改文件指针