gpt4 book ai didi

用于打印 C 文件的函数详细信息的 C 程序

转载 作者:行者123 更新时间:2023-11-30 18:32:24 27 4
gpt4 key购买 nike

对于给定的 C 代码,我想打印函数名称和每个函数的行数。

下面是我的代码:

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


char *ffname(char *line,char *name)
{

int i=1,j=0;
char *dt;

strtok(line,"(");
dt = strchr(line,' ');
if(dt[i] == '*')
i++;
while(dt[i] != '\0')
{
name[j]=dt[i];
i++;
j++;
}
name[j] ='\0';
return NULL; //...
}
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, fg=0,size=0,emptyflag=0,commandflag=0;
char c[SIZE],b[SIZE],st[SIZE],d[SIZE];
char *fname;
int command[]={};
FILE *fd;
fd = fopen(argv[1],"r");
while(fgets(c,SIZE,fd))
{
emptyflag=0;
lines++;
for(i=0;i<(sizeof(command)/4);i++)
{
if(lines == command[i])
{
commandflag=1;
break;
}
}
strcpy(st,c);
strtok(st," ");
size = strlen(c);
if(size == 1 && (strcmp(c,"\n"))== 0)// Checking for empty line
emptyflag=1;
if( !strcmp(st,"struct")) // Checking whether line is structure or struct function
fg=1;
for(i=0;i<size;i++)
{
if(commandflag)
{
break;
}
while( c[i] =='\t' || c[i] == ' ')
{
i++;
}
if( c[i] == '{')
{
count++;
if(flag)
{
if(!emptyflag)
funlines++;
else
emptyflag=0;
}
if(count ==1 && fg ==1)
{
if(b[strlen(b)-2] == ')')
{
fn++;
printf("Dhahira");
printf("Function %d is Started..............\n", fn);

flag = 1;
printf("Dhahira");
ffname(b,fname);
printf("Function name is:%s\n",fname);
}
else
{
count--;
}
}
else if(count == 1)
{
fn++;
printf("Function %d is Started..............\n", fn);
flag = 1;
ffname(b,fname);//...
printf("Function name is:%s\n",fname);
}
break;
}
else if( c[i] == '}')
{
count--;
if(count ==0 && fg ==1)
{
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;//...
strcpy(s[fn-1].funcname,fname);//..
funlines = 0;
fg=0;
}
else if(count ==0)
{
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;//...
strcpy(s[fn-1].funcname,fname);//..
funlines = 0;
}
else if(count == -1)
{
count=0;
fg=0;
}
else
{
if(!emptyflag)
funlines++;
else
emptyflag=0;
}
break;
}
else if(flag ==1 && fg==1)
{
if(!emptyflag)
funlines++;
else
emptyflag=0;
break;
}
else if(flag)
{
if(!emptyflag)
funlines++;
else
emptyflag=0;
break;
}
break;
}
if(commandflag == 1)
commandflag = 0;
else
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;
}

我得到以下输出。

Function 1 is Started..............
Segmentation fault (core dumped)

我认为ffname功能可能是一个原因。但是,当我在 printf("Function %d is Started..............\n", fn); 行上方包含 printf 语句时,仍然不打印该行。所以,我无法弄清楚这个问题背后的真正原因。请指导我解决这个问题。

最佳答案

段错误是由于未初始化使用 fname 造成的。将其声明为数组:

char fname[256]; // or dynamically allocate

它应该可以工作。您看不到 printf 输出,因为该函数写入缓冲区并且不会立即输出您写入的内容。段错误后,缓冲的输出就消失了。您可以在 printf 之后使用 fflush(stdout) 强制立即输出。

如果您使用 -Wall 标志编译代码,您还会看到一条警告消息。

关于用于打印 C 文件的函数详细信息的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14009088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com