增量后重置Argv指针

时间:2013-03-11 14:27:18

标签: c

我有一个基于char ** argv命令行参数打开文件的程序。这是逻辑:

char * openErrorString = "Error opening file: ";
FILE *fp1 = fopen(*++argv, "r");
if (fp1 == NULL) {
    perror(openErrorString);
    return 1;
}   
FILE *fp2 = fopen(*++argv, "r");
if (fp2 == NULL) {
    perror(openErrorString);
    return 1;
}

问题是,我后来想要比较两个文件,并在文件中的行不匹配时给出有意义的输出。这是我为此写的代码:

while (fgets(fp1Line, max, fp1) != NULL &&
        fgets(fp2Line, max, fp2) != NULL) {
    if (strcmp(fp1Line, fp2Line)) {
        printf("%s\n","Line discrepancy found:");
        printf("%s: %s\n", argv[1], fp1Line);
        printf("%s: %s\n", argv[2], fp2Line);
        fclose(fp1);
        fclose(fp2);
        return 0;
    }
}

但是,当我在argv[1]语句中调用printf时,我得到(null),即argv中的最后一个条目。当我致电argv[2]时,我会得到TERM_PROGRAM=Apple_Terminal。我不知道那是什么。似乎正在发生的是因为我在访问它时打开文件时两次递增argv指针,现在argv从第二个命令行参数开始。除了在打开文件后执行两行*argv--之外,还有一种重置此行为的好方法吗?

3 个答案:

答案 0 :(得分:4)

我的建议是不要修改argv。将指针复制到另一个变量中,然后递增。通过这种方式,您可以反复使用argv,而不用担心它现在指向的位置。

答案 1 :(得分:3)

只是不要增加argv,例如:

FILE *fp1 = fopen(argv[0], "r");
// ...
FILE *fp2 = fopen(argv[1], "r");

答案 2 :(得分:2)

如果再次需要,没有理由更改argv指针。相反,替换

FILE *fp1 = fopen(*++argv, "r");

通过

FILE *fp1 = fopen(argv[1], "r");

FILE *fp2 = fopen(*++argv, "r");

通过

FILE *fp2 = fopen(argv[2], "r");