使用Syscall进行子串搜索

时间:2014-02-09 00:24:52

标签: c search substring

我正在尝试使用sys调用进行子字符串搜索,我从命令行打开一个文件,并将以下命令行参数与文件进行比较。我想输出每个子字符串的出现次数。例如,如果我写了./a.out filename aa b我正在查找文件名中出现aa和b的次数。

到目前为止我的代码

for(int num = 4; num < argc; num++)
    {
      int fp = open (argv[1], O_RDONLY);
      int sizeofbar = strlen(argv[1]);
      char *buf = (char*)malloc(sizeofbar+1);
      int count = 0;  //counter for output                                  
      char* string2 = argv[num];
      int sizeofcompare = strlen(string2);

      read(fp, buf, sizeofcompare);
      while (strstr(buf, string2) != NULL)
        {

          count++;
          buf++;
        }

1 个答案:

答案 0 :(得分:0)

我认为你需要在进入循环之前做一些初始化。也许你想先取下第一个参数:

filename = argv[0];    
argv++;
argc--;
int fp = open(...

接下来,我会预处理其余的参数,以构建一个数据结构来存储它。您可以使用argc值来确定需要跟踪的单词数。

counts = (int *)calloc(argc, sizeof(int));

请注意,这也会将值初始化为零。

随着一切设置,然后我会读完整个文件内容并与字符串进行比较。诀窍是一次比较多个不同长度的字符串。一个简单而低效的方法是读取整个文件内容,然后使用strstr循环文件名后面的每个单词。另一种方法是将文件的内容映射到内存中并直接扫描(让操作系统完成繁重的操作)。