Вот его версия.У него нет проверки ошибок и, возможно, есть ошибки переполнения.Но я думаю, что он находит желаемую строку и учитывает возврат, необходимый для частичных совпадений подстрок.Я сомневаюсь, что осталось более 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" );
}