我正在尝试使用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++;
}
答案 0 :(得分:0)
我认为你需要在进入循环之前做一些初始化。也许你想先取下第一个参数:
filename = argv[0];
argv++;
argc--;
int fp = open(...
接下来,我会预处理其余的参数,以构建一个数据结构来存储它。您可以使用argc值来确定需要跟踪的单词数。
counts = (int *)calloc(argc, sizeof(int));
请注意,这也会将值初始化为零。
随着一切设置,然后我会读完整个文件内容并与字符串进行比较。诀窍是一次比较多个不同长度的字符串。一个简单而低效的方法是读取整个文件内容,然后使用strstr循环文件名后面的每个单词。另一种方法是将文件的内容映射到内存中并直接扫描(让操作系统完成繁重的操作)。