2011-02-07 2 views
0

교수님이 수업에서이 예제를 인용했습니다. 그 기본적으로 유닉스 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에서 나온 것이므로 교수님을 비난 할 수는 없습니다. – 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; 
}