1

errnoで使用すると、予期しない値が発生perrorglibcます。存在しないファイルが期待どおりarg[1]に印刷されるときに指定された場合Error: 2(これはENOENT)。ただし、以下の行のコメントが解除されると、何を渡してもperrorエラー22()がスローされます。EINVALなぜこれが設定されているのか誰かが説明できますか?

編集:これはある種のEclipseのバグのようです。IDEは、perrorに何らかのエラーをスローさせているようです。プログラムはコマンドラインで完全に機能し、Eclipseの引数リストで正しいファイルが指定されている場合は完全に機能します。Eclipse内で実行すると、正しく失敗します。

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[]) {
FILE *input_file;
input_file = fopen(argv[argc - 1], "r");
if (!input_file) {
 // perror(argv[argc-1]);
    fprintf(stderr, "Error: %d\n", errno);
    return (EXIT_FAILURE);
}
else {
    fclose(input_file);
}
return (EXIT_SUCCESS);
}
4

3 に答える 3

5

errno他のライブラリ関数を呼び出した後の値に依存することはできません。つまり、perror()の呼び出し自体がの値を変更している可能性がerrno あります。使用できるようにするには、一時変数に保存する必要があります。他のライブラリプロシージャを呼び出した後。

if (!input_file) {
    int err = errno;
    perror(argv[argc-1]);
    fprintf(stderr, "Error: %d\n", err);
    return (EXIT_FAILURE);
}
于 2011-02-11T23:08:51.637 に答える
1

あなたのプログラムはここで私にとって期待通りに機能します:

$ ./app fkjhsf
Error: 2

コメントなしのperror()呼び出しで:

$ ./app asdkfljh
asdkfljh: No such file or directory
Error: 2

たぶん、電話は何らかの理由でperror()あなたを変えていますか?errno使用しているオペレーティングシステム/コンパイラ/ライブラリのバージョンは何ですか?

于 2011-02-11T22:38:08.920 に答える
0

彼はおそらく引数なしでプログラムを実行しています。

その場合、「argv[argc-1]」はガベージと評価されます。

「argc-1」が有効な範囲内にあることを確認するコードが必要です。

于 2011-02-11T23:02:47.597 に答える