我想通过Boyer-Moore-Horspool实现在文本文件中搜索一些字符串。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int bmhSearch(char *needle) {
FILE *fp;
int find_result = 0;
char temp[512];
size_t nlen = strlen(needle);
size_t scan = 0;
size_t bad_char_skip[UCHAR_MAX + 1];
size_t last;
if((fopen_s(&fp, "book.txt", "r")) != NULL) {
return(-1);
}
while(fgets(temp, 512, fp) != NULL) {
size_t hlen = strlen(temp);
/* pre */
for (scan = 0; scan <= UCHAR_MAX; scan = scan + 1)
bad_char_skip[scan] = nlen;
last = nlen - 1;
for (scan = 0; scan < last; scan = scan + 1)
bad_char_skip[needle[scan]] = last - scan;
while (hlen >= nlen){
/* scan from the end of the needle */
char *ptemp = temp;
for (scan = last; ptemp[scan] == needle[scan]; scan = scan - 1){
if (scan == 0){
find_result++;
}
}
hlen -= bad_char_skip[ptemp[last]];
ptemp += bad_char_skip[ptemp[last]];
printf("%d\t%d\n", hlen, nlen);
}
}
if(fp) {
fclose(fp);
}
return find_result;
}
int main(void){
char needle[30] = {"some text like this"};
printf("Matches found: %d\n", bmhSearch(needle);
}
我相信,我做错了很多事,但我真的无法找到并修复它。
我唯一得到的是在某个阶段,程序不符合条件while(hlen >= nlen)
。
答案 0 :(得分:1)
如果问题是&#34;代码有什么问题?&#34 ;;以下是一些事情:
printf("Matches found: %d\n", bmhSearch(needle); // Missing a final ')'.
int main(void)
{
...
return(0); // Something like this line is required for a function that returns'int'.
}
size_t bad_char_skip[UCHAR_MAX + 1]; // Requires: '#include <limits.h>
if((fopen_s(&fp, "book.txt", "r")) != NULL) {
功能&#39; fopen_s()&#39;不返回指针。它返回一个errno_t类型,它是一个整数值。比较整数与&#39; NULL&#39;就像出现在印度的战争舞蹈&#39;打扮成牛仔。也许以下更合适:
if((fopen_s(&fp, "book.txt", "r")) != 0) {
相当于(我最喜欢的):
if(fopen_s(&fp, "book.txt", "r")) {
printf("%d\t%d\n", hlen, nlen);
上述格式字符串不正确。它应该是:
printf("%zu\t%zu\n", hlen, nlen);
严格来说,需要注意以下几行:
bad_char_skip[needle[scan]] = last - scan;
hlen -= bad_char_skip[ptemp[last]];
ptemp += bad_char_skip[ptemp[last]];
应将其更改为以下内容:
bad_char_skip[(int)needle[scan]] = last - scan;
hlen -= bad_char_skip[(int)ptemp[last]];
ptemp += bad_char_skip[(int)ptemp[last]];
变量&#39; ptemp&#39;被定义为&#39; char *&#39;。因此, &#39; PTEMP [N]&#39;评估为“char&#39;类型;而数组索引号必须是&#39; int&#39;。