2012-12-21 2 views
2

함수를 찾고 C 파일에서 함수의 행 수를 계산하기 위해 C 프로그램을 작성하고 구조에 저장하고 있습니다. 아래 코드를 입력했습니다.C로 세부 사항 저장하기

#include <stdio.h> 
#include <string.h> 

#define SIZE 1024 
struct fundetails 
{ 
    int nooflines; 
    char *funcname; 
}s[20]; 
char *ffname(char *line) 
{ 
    int i=1,j=0; 
    char *dt; 
    char name[SIZE]; 
    strtok(line,"("); 
    dt = strchr(line,' '); 
    if(dt[i] == '*') 
     i++; 
    while(dt[i] != '\0') 
    { 
     name[j]=dt[i]; 
     i++; 
     j++; 
    } 
    name[j] ='\0'; 
    return name; 
} 

int main(int argc, char **argv) 
{ 
    if(argc < 2) 
    { 
     printf("Give the filename \n"); 
     printf("Usage: %s filename\n", argv[0]); 
     return -1; 
    } 
    int i, lines =0, funlines =0,count =0, fn =0, flag =0, size=0,emptyflag=0; 
    char c[SIZE],b[SIZE]; 
    char *fname; 
    FILE *fd; 
    fd = fopen(argv[1],"r"); 
    while(fgets(c,SIZE,fd)) 
    { 
     emptyflag=0; 
     lines++; 
     size = strlen(c); 
     if(size == 1 && (strcmp(c,"\n"))== 0) 
      emptyflag=1; 
     for(i=0;i<size;i++) 
     { 
      while(c[i] =='\t' || c[i] == ' ') 
      { 
       i++; 
      } 
      if(c[i] == '{') 
      { 
       count++; 
       if(flag) 
       { 
        if(!emptyflag) 
         funlines++; 
        else 
         emptyflag=0; 
       } 
       if(count == 1) 
       { 
        fn++; 
        printf("Function %d is Started..............\n", fn); 
        flag = 1; 
        fname=ffname(b); 
        printf("Function name is:%s\n",fname); 
       } 
       break; 
      } 
      else if(c[i] == '}') 
      { 
       count--; 
       if(!count) 
       { 
        flag = 0; 

        printf("No of lines in the function %d is: %d\n", fn, funlines); 
        printf("Function %d is finished..........\n", fn); 
        s[fn-1].nooflines=funlines; 
        s[fn-1].funcname=fname; 
        funlines = 0; 
       } 
       else 
       { 
        if(!emptyflag) 
         funlines++; 
        else 
         emptyflag=0; 
       } 
       break; 
      } 
      else if(flag) 
      { 
       if(!emptyflag) 
         funlines++; 
        else 
         emptyflag=0; 
       break; 
      } 
     } 
     strcpy(b,c); 
    } 
    printf("FUN_NAME\tNO_OF_LINES\n"); 
    for(i=0;i<fn;i++) 
    { 
    printf("%s\t\t%d\n",s[i].funcname,s[i].nooflines); 
    } 
    return 0; 
} 

경고가 try.c:26:2: warning: function returns address of local variable [enabled by default]으로 생성됩니다. 그리고 아래와 같이 결과를 산출합니다. I 라인 위

s[fn-1].nooflines=funlines; 
s[fn-1].funcname=fname; 

의 때마다, GDB에서 실행 동일한 loop.WQhile의 i1m에 function name and no of lines를 기억하고있어

Function 1 is Started.............. 
Function name is:fundetails 

No of lines in the function 1 is: 2 
Function 1 is finished.......... 
Function 2 is Started.............. 
Function name is:dhahira 
No of lines in the function 2 is: 1 
Function 2 is finished.......... 
Function 3 is Started.............. 
Function name is:add 
No of lines in the function 3 is: 3 
Function 3 is finished.......... 
Function 4 is Started.............. 
Function name is:sub 
No of lines in the function 4 is: 9 
Function 4 is finished.......... 
Function 5 is Started.............. 
Function name is:main 
No of lines in the function 5 is: 13 
Function 5 is finished.......... 
FUN_NAME NO_OF_LINES 
main  2 
main  1 
main  3 
main  9 
main  13 

, 라인의 수는 구성하지 correctly.But 저장해 함수 이름의 경우. Problem: 줄에 제대로 작동하고 함수 이름에 대해 작동하지 않는 이유가 무엇인지 이해가 안됩니까? 그 경고 때문인가? 고마워. 고마워.

답변

1

먼저 구조체

struct fundetails 
{ 
    int nooflines; 
    char funcname[128]; 
}s[20]; 

다음 FUNC의 ffname의 반환 값을 고정합니다 당신이 범위의 외출 사라집니다 데이터에 대한 포인터 반환 할 수 없습니다 (이 경우, 함수의 끝) . 싼 빠른 수정으로 만 설정하여

char name[SIZE]; 

그런

static char name[SIZE]; 

대신

strcpy(s[fn-1].funcname, fname); 

에 당신의

s[fn-1].funcname=fname; 

출력은

같은 것
FUN_NAME  NO_OF_LINES 
fundetails 
       2 
ffname   15 
main   82 

기능을 식별하는 방법을 확인하지는 않았지만 너무 순진하게 보입니다. (대답은 코드의 모든 문제를 해결하지 못할 수도 있습니다. 예를 들어, 코드에 fname을 사용하기 전에 경로가있을 수 있습니다 ... ...)

4

ffname()에서 name []은 로컬이며 함수를 실행할 때 스택으로 푸시됩니다. ffname()이 반환 된 후, 스택이 pop되고, name []에 의해 점유 된 메모리가 해제되었다는 의미이고, 시스템은 메모리를 재사용 할 수 있지만 메모리가 재사용되기 전에는 여전히 데이터가 남아 있습니다. 그래서 언젠가는 작동하고 언젠가는 그렇지 않습니다. 또한, 당신이 경고를받는 이유입니다.

구조체에서 funcname을 포인터가 아닌 배열로 정의해야합니다. 왜냐하면 funcname은 funcname을 항상 같은 이름 []으로 가리키고 name []은 각 루프에 쓰여 지므로 마침내 동일한 이름을 5 번 인쇄합니다.

strcpy(funcname, name); // this is right way when funcname is array 

보다는 : 당신이 배열에 funcname에를 변경 한 후

, 당신은 이름을 복사하는 strcpy를 사용해야합니다 funcname에 = 이름;

+0

name []을 전역으로 선언하면 will 이 문제가 해결되었습니다. – Dhasneem

+0

name []을 global로 정의하면 progream의 수명주기를 통해 메모리가 점유됩니다. 문제를 해결할 것입니다.그러나 그것은 최선의 해결책이 아닙니다. 더 좋은 방법은 name을 ffname()에 저장하기위한 버퍼를 전달하는 것입니다. – TieDad

+0

감사합니다. 경고를 극복하는 것이 좋습니다. 그러나 출력은 동일하게 유지됩니다. – Dhasneem