0

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;
}

問題は、後で2つのファイルを比較して、ファイルの行が一致しないときに意味のある出力を提供したいということです。これが私がそのために書いたコードです:

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ポインターを2回インクリメントしたため、argvは2番目のコマンドライン引数から開始するようになりました。*argv--ファイルを開いてから2行実行する以外に、この動作をリセットする良い方法はありますか?

4

3 に答える 3

4

私のアドバイスは、変更しないことargvです。ポインタのコピーを別の変数に作成し、それをインクリメントします。このように、あなたは何度も何度も使うことができargv、それが今どこを指しているかについて心配する必要はありません。

于 2013-03-11T14:29:00.013 に答える
3

たとえば、argvをインクリメントしないでください。

FILE *fp1 = fopen(argv[0], "r");
// ...
FILE *fp2 = fopen(argv[1], "r");
于 2013-03-11T14:29:33.867 に答える
2

再度必要になった場合にargvポインタを変更する理由はありません。代わりに、

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

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

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

FILE *fp2 = fopen(argv[2], "r");
于 2013-03-11T14:30:23.860 に答える