📄 pbmsrch.c
字号:
/*** A Pratt-Boyer-Moore string search, written by Jerry Coffin** sometime or other in 1991. Removed from original program, and** (incorrectly) rewritten for separate, generic use in early 1992.** Corrected with help from Thad Smith, late March and early** April 1992...hopefully it's correct this time. Revised by Bob Stout.**** This is hereby placed in the Public Domain by its author.**** 10/21/93 rdg Fixed bug found by Jeff Dunlop*/#include <stddef.h>#include <string.h>#include <limits.h>static size_t table[UCHAR_MAX + 1];static size_t len;static char *findme;/*** Call this with the string to locate to initialize the table*/void init_search(const char *string){ size_t i; len = strlen(string); for (i = 0; i <= UCHAR_MAX; i++) /* rdg 10/93 */ table[i] = len; for (i = 0; i < len; i++) table[(unsigned char)string[i]] = len - i - 1; findme = (char *)string;}/*** Call this with a buffer to search*/char *strsearch(const char *string){ register size_t shift; register size_t pos = len - 1; char *here; size_t limit=strlen(string); while (pos < limit) { while( pos < limit && (shift = table[(unsigned char)string[pos]]) > 0) { pos += shift; } if (0 == shift) { if (0 == strncmp(findme, here = (char *)&string[pos-len+1], len)) { return(here); } else pos++; } } return NULL;}#ifdef TEST#include <stdio.h>main(){ char *here; char *find_strings[] = {"abb", "you", "not", "it", "dad", "yoo", "hoo", "oo", "oh", "xx", "xx", "x", "x", NULL}; char *search_strings[] = {"cabbie", "your", "It isn't here", "But it is here", "hodad", "yoohoo", "yoohoo", "yoohoo", "yoohoo", "yoohoo", "xx", "x", "."}; int i; for (i = 0; find_strings[i]; i++) { init_search(find_strings[i]); here = strsearch(search_strings[i]); printf("\"%s\" is%s in \"%s\"", find_strings[i], here ? "" : " not", search_strings[i]); if (here) printf(" [\"%s\"]", here); putchar('\n'); } return 0;}#endif /* TEST */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -