指定した文字列が出てくるファイル名と行数を取得し表示したいと思っています。
途中までファイルが全部表示されてしまい、最後にはSegmentation faultが出てしまいます。
どこがおかしいのか教えてください。
また、よろしければ、より効率よく実行できるような技術があれば助言していただけるとありがたいです。
よろしくお願いします。
開発環境
Mac OSX
gcc
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
int _search(char *, char *);
int main(int argc, char *argv[])
{
char path[1024];
char word[1024];
int i;
printf("\n\n"
"************************************************\n"
"* Word Search 〜Ver.1.0〜\n"
"************************************************\n");
if(argc <= 1)
{
strcpy(path,".");
}
else
{
for(i=1; i<argc; i++)
{
if(strcmp(argv[i],"-l") == 0)
{
if(strcmp(argv[i+1],"") != 0)
{
strcpy(path,argv[i+1]);
}
else
{
printf("Option ERROR!!\n");
return 0;
}
}
else if(strcmp(argv[i],"-w") == 0)
{
if(strcmp(argv[i+1],"") != 0)
{
strcpy(word,argv[i+1]);
}
else
{
printf("Option ERROR!!\n");
return 0;
}
}
}
}
if(strcmp(path,"") == 0)
{
strcpy(path,".");
}
_search(path,word);
return 0;
}
int _search(char *path, char *word)
{
struct stat st;
struct dirent *dp;
char *get_path;
char *get_word;
char *ex;
char dir_file[1024];
char next_dir[1024];
char buf[1024];
char check_buf[1024];
char file_dir[1024];
int i,x;
mode_t m;
FILE *fp;
DIR *dir;
get_path = path;
get_word = word;
dir = opendir(get_path);
if(dir == NULL)
{
printf("Directory open ERROR!!\n");
printf("%s",get_path);
return 0;
}
for(dp=readdir(dir); dp!=NULL; dp=readdir(dir))
{
sprintf(dir_file,"%s",dp->d_name);
stat(dir_file,&st);
m = st.st_mode;
if(S_ISREG(m))
{
ex = strstr(dir_file,".");
if((strcmp(ex,".c") == 0) || (strcmp(ex,".cpp") == 0) || (strcmp(ex,".h") == 0))
{
sprintf(file_dir,"%s/%s",path,dir_file);
fp = fopen(file_dir,"r");
if(fp == NULL)
{
printf("File open ERROR!!\n");
return 0;
}
x = 1;
while((fgets(buf,1024,fp)) != NULL)
{
sprintf(check_buf,"%s",buf);
if(strpbrk(check_buf,get_word) != NULL)
{
printf("%s : %d \"%s\"",file_dir,x,check_buf);
}
x++;
}
fclose(fp);
}
}
if(S_ISDIR(m))
{
if((strcmp(dir_file,".") != 0) && (strcmp(dir_file,"..") != 0))
{
sprintf(next_dir,"%s/%s",path,dir_file);
_search(next_dir,get_word);
}
}
}
closedir(dir);
printf("\n");
return 0;
}