Вот хлопнул вместе версию. Он не имеет проверки ошибок и, вероятно, имеет ошибки переполнения. Но я думаю, что он находит нужную строку и учитывает обратный отсчет, необходимый для парных подстрок. Я сомневаюсь, что осталось более 15 ошибок.
Редактировать: В первом ответе было по крайней мере одно. Я проснулся посреди ночи и понял, что проверка назад была неправильной. Он не нашел «12123» в «1212123». Это может быть и не так, но, по крайней мере, сейчас это находит.
int main(int argc, char* argv[])
{
FILE *fp;
char *find, *hist;
int len, pos=0, hl=0, i;
char c;
fp = fopen(argv[1], "r");
find = argv[2];
len = (int)strlen(find);
hist = malloc(len);
memset(hist, 0, len);
while (!feof(fp)) {
c = fgetc(fp);
if (find[pos++] == c) {
if (pos == len) {
printf("Found it\n");
return 1;
}
}
else {
// check history buffer (kludge for backtracking)
if (pos > 0) {
pos = 0;
for (i = 0; i < len - 1; i++)
if (0 == memcmp(hist+len-i-1, find, i + 1)) {
// we had a mismatch, but the history matches up to len i
pos = i;
}
}
}
// update history buffer - this is innefficient - better as circular buffer
memmove(hist, hist + 1, len - 1);
hist[len-1] = c;
}
printf("Not found\n");
}
Вы можете загрузить весь файл в память? –
Он не слишком большой (<2MB), но я не знаю, как (у меня есть опыт около 30 минут C до сих пор) – igul222
Я поставил реализацию «memmem» в свой ответ - и «memstr (mem, memlen , str) 'это просто' memmem (mem, memlen, str, strlen (str) + 1) '. – caf