我想编写一个 C 代码来查找 C 文件中的所有函数并打印相应的函数名称。
我的代码是:
#include <stdio.h>
#include <string.h>
#define SIZE 1024
void ffname(char *line)
{
int i=1,j=0;
char *dt;
char *name;
strtok(line,"(");
dt = strchr(line,' ');
if(dt[i] == '*')
i++;
while(dt[i] != '\0')
{
name[j]=dt[i];
i++;
j++;
}
name[j] ='\0';
printf("Function name is: %s\n", 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;
char c[100],b[100];
FILE *fd;
fd = fopen(argv[1],"r");
while(fgets(c,SIZE,fd))
{
lines++;
i=0;
for(i=0;i<strlen(c);i++)
{
while( c[i] =='\t' || c[i] == ' ')
{
i++;
}
if( c[i] == '{')
{
count++;
if(flag)
{
funlines++;
}
if(count == 1)
{
fn++;
printf("Function %d is Started..............\n", fn);
flag = 1;
ffname(b);
}
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);
funlines = 0;
}
else
{
funlines++;
}
break;
}
else if(flag)
{
funlines++;
break;
}
}
strcpy(b,c);
}
printf("Total no of fucnion%d\n",fn);
printf("Total no of lines%d\n",lines);
return 0;
}
当我将以下 C 文件作为输入时,
#include<stdio.h>
void add()
{
int a=5,b=7;
printf("Addition is:%d\n", a+b);
}
void sub()
{
int a=20,b=8;
printf("Subtraction is:%d\n", a-b);
}
void main()
{
char *name="dhahira dhasneem";
char *line;
line=strchr(name,' ');
printf("Line:%s\n",line);
printf("Name:%s\n",name);
add();
sub();
}
我得到以下输出。
Function 1 is Started..............
Segmentation fault (core dumped)
我使用valgrind
,但我不知道如何识别错误。请指导我。谢谢你。
更新:
当我使用建议的答案时,我得到了输出。之后,我想扩展我之前的代码,将函数的详细信息(函数名称和函数深度)存储到一个结构中。当我用来存储简单程序的功能详细信息时,我得到了输出。但是当我在gdb
.
(gdb) b 87
Breakpoint 1 at 0x804885e: file fun_printstruct.c, line 87.
(gdb) r dat.c
Starting program: /home/dhahira/dhas/Project/a.out dat.c
Function 1 is Started..............
Program received signal SIGSEGV, Segmentation fault.
0x080485d4 in ffname (line=0xbfffe71c "/*struct *dhahira", name=0x0)
at fun_printstruct.c:21
21 name[j]=dt[i];
(gdb) s
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
我的代码是:(扩展用于将功能细节存储到结构中)
#include <stdio.h>
#include <string.h>
#define SIZE 1024
void 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';
printf("Function name is: %s\n", 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, fg=0,size=0,emptyflag=0,commandflag=0;
char c[SIZE],b[SIZE],st[SIZE],d[SIZE];
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)
emptyflag=1;
if( !strcmp(st,"struct"))
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("Function %d is Started..............\n", fn);
flag = 1;
ffname(b);
}
else
{
count--;
}
}
else if(count == 1)
{
fn++;
printf("Function %d is Started..............\n", fn);
flag = 1;
ffname(b);
}
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);
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);
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("Total no of fucnion%d\n",fn);
printf("Total no of lines%d\n",lines);
return 0;
}
请指导我克服这个问题。
这个问题是因为扩展代码而出现的吗?(我可以单独得到正确的输出。)