#include <stdio.h> #include <string.h> #define MAXN 1005 #define MAXM 100 #define MAX_ASCII 128 int T[MAX_ASCII]; // 记录每个字符的移动距离 void initT(char* P, int m) { // 初始化T数组 for (int i = 0; i < MAX_ASCII; i++) { T[i] = m; } for (int i = 0; i < m - 1; i++) { T[P[i]] = m - 1 - i; } } int Horspool(char* T, char* P) { int n = strlen(T), m = strlen(P); initT(P, m); // 初始化T数组 int i = m - 1; // i指向文本串中当前比较的字符位置 while (i < n) { int j = m - 1; // j指向模式串中当前比较的字符位置 while (j >= 0 && T[i] == P[j]) { i--; j--; } if (j < 0) { // 匹配成功 return i + 1; } i += T[T[i + m - 1]]; // 移动i } return -1; // 匹配失败 } int main() { char T[MAXN], P[MAXM]; fgets(T, MAXN, stdin); fgets(P, MAXM, stdin); int m = strlen(P); if (P[m - 1] == '\n') { // 去掉P中的换行符 P[m - 1] = '\0'; m--; } printf("%s", T); printf("%s\n", P); initT(P, m); for (int i = 0; i < m - 1; i++) { printf("%c:%d\n", P[i], T[P[i]]); } printf("else:%d\n", T[0]); int pos = Horspool(T, P); printf("%d\n", pos); return 0; }这段代码出错了,错在哪里,如何修改
时间: 2023-12-30 12:05:15 浏览: 74
这段代码似乎没有明显的语法错误,但是有一些可能会导致程序运行错误的问题。
首先是输入的问题,fgets函数会读入换行符,需要在读入P后判断是否为换行符并处理掉。其次是初始化T数组的问题,应该将P中所有字符的移动距离都初始化为m,而不是只初始化前m-1个字符的移动距离。最后是移动i的问题,应该根据i+m-1位置的字符来移动i,而不是根据i位置的字符来移动i。
修改后的代码如下:
```
#include <stdio.h>
#include <string.h>
#define MAXN 1005
#define MAXM 100
#define MAX_ASCII 128
int T[MAX_ASCII]; // 记录每个字符的移动距离
void initT(char* P, int m) { // 初始化T数组
for (int i = 0; i < MAX_ASCII; i++) {
T[i] = m;
}
for (int i = 0; i < m; i++) {
T[P[i]] = m - i - 1;
}
}
int Horspool(char* T, char* P) {
int n = strlen(T), m = strlen(P);
initT(P, m); // 初始化T数组
int i = m - 1; // i指向文本串中当前比较的字符位置
while (i < n) {
int j = m - 1; // j指向模式串中当前比较的字符位置
while (j >= 0 && T[i] == P[j]) {
i--;
j--;
}
if (j < 0) { // 匹配成功
return i + 1;
}
i += T[T[i + m - 1]]; // 移动i
}
return -1; // 匹配失败
}
int main() {
char T[MAXN], P[MAXM];
fgets(T, MAXN, stdin);
fgets(P, MAXM, stdin);
int m = strlen(P);
if (P[m - 1] == '\n') { // 去掉P中的换行符
P[m - 1] = '\0';
m--;
}
printf("%s", T);
printf("%s\n", P);
initT(P, m);
for (int i = 0; i < m; i++) {
printf("%c:%d\n", P[i], T[P[i]]);
}
printf("else:%d\n", T[P[m - 1]]);
int pos = Horspool(T, P);
printf("%d\n", pos);
return 0;
}
```
阅读全文