2011-02-07 11 views
0

私の教授はこの例をクラスで引用しました。その基本的にUnixのmoreコマンドのバージョン、と私は*fpは、ファイルポインタを定義し、その*のAV []は、コマンドライン引数の配列であることを理解しコマンドライン引数ポインタの理解に問題がある

int main(int ac , char *av[]) 
{ 
    FILE *fp; 

    if (ac == 1) 
    do_more(stdin); 
    else 
    while (--ac) 
    if ((fp = fopen(*++av , "r")) != NULL) 
    { 
     do_more(fp) ; 
     fclose(fp); 
    } 
    else 
     exit(1); 
return 0; 
} 

その中にカップルの事に不安です。しかし、操作上、*++avの意味は何ですか?このような

+1

引数 'int argc'、' char * argv [] 'の名前を付ける方がはるかに一般的です。この慣例は決して必須ではありませんが。 – ulidtko

+0

コードスニペットはBruce MolayのUnderstanding Unix/Linux Programmingからのものでしたので、私はProfの責任を責めることはできません。 – Jason

答えて

8

読み取り* ++ AV:この例では

++av // increment the pointer 
*av // get the value at the pointer, which will be a char* 

は、それがコマンドラインに渡されたすべてのファイルを開きます。また

:ここ

av[0] // program name 
av[1] // parameter 1 
av[2] // parameter 2 
av[3] // parameter 3 
av[ac - 1] // last parameter 
+5

+1一般的に* av []の最初の値であるため、アプリケーション名をスキップするためにプリインクリメントしています。 –

+0

わかりやすい答えをありがとう。 – Jason

2

は非常に同じことを行う必要があり、コードの改良版です。うまくいけば理解しやすくなります。 argcargvの名前は事実上の標準であるため、他のプログラマにとって理解しやすいようにコードを使用する必要があります。

int main (int argc, char *argv[]) 
{ 
    FILE *fp; 
    int i; 

    if (argc == 1) 
    { 
    do_more(stdin); 
    } 
    else 
    { 
    for(i=1; i<argc; i++) /* skip the name of the executable, start at 1 */ 
    { 
     fp = fopen (argv[i], "r"); 
     if(fp == NULL) 
     { 
     /* error message, return etc here */ 
     } 

     do_more(fp) ; 
     fclose(fp); 
    } 
    } 

    return 0; 
} 
関連する問題