int KMP_match(char text[MaxSize + 1], char keys[MaxSize + 1], int start) { int i=start,j=1; while(i<=text[0]&&j<=keys[0]) { if(j==0||text[i]==keys[j]) { i++; j++; } else { j=next[j]; } } if (j>keys[0] &&(text[i+1]<0x61|| text[i+1]>0x7A))//判断目标单词最后一个字母的后一位是否为字母 { return (i-keys[0]); } else { return 0; } }添加一个限制条件为查找到符合条件字符串后,判断这个字符串的前一位字符不属于小写字母,则输出这个字符串
时间: 2024-03-13 21:42:25 浏览: 7
可以在if语句中添加一个判断条件,判断目标字符串的前一位字符是否为小写字母。如果不是小写字母,则输出这个字符串。可以在原有的if语句中添加一个&&条件,如下所示:
```
if (j>keys[0] &&(text[i+1]<0x61|| text[i+1]>0x7A) &&(text[i-keys[0]]<0x61|| text[i-keys[0]]>0x7A))
{
//判断目标单词最后一个字母的后一位是否为字母,
//并且判断目标单词的前一位是否为字母,如果不是字母,则输出这个字符串
return (i-keys[0]);
}
```
这样修改后,当找到符合条件的字符串后,会先判断其前一位是否为小写字母,如果不是,则输出这个字符串的位置。如果是小写字母,则继续查找下一个符合条件的字符串。
相关问题
int next[MaxSize]; //用于kmp算法,主要存储每个字符的前后缀的值; //KMP算法 //求next数组 void get_next(char t[MaxSize + 1],int nextval[]) { int i, k; i = 1,k = 0; next[1] = 0; while(i < t[0]) // t[0]储存的是字符串的长度 { if(k == 0 || t[i] == t[k]) { i++; k++; next[i] = k; } else { k = next[k]; //否则k值回溯 } } } //KMP算法主体 int KMP_match(char text[MaxSize + 1], char keys[MaxSize + 1], int start) { int i=start,j=1; while(i<=text[0]&&j<=keys[0]) { if(j==0||text[i]==keys[j]) { i++; j++; } else { j=next[j]; } } if (j>keys[0] &&(text[i+1]<0x61|| text[i+1]>0x7A))//判断目标单词最后一个字母的后一位是否为字母 { return (i-keys[0]); } else { return 0; } }翻译这段代码
这段代码实现了 KMP 算法,用于在一个字符串中查找另一个字符串出现的位置。下面是代码注释和翻译:
```
int next[MaxSize]; // 用于 kmp 算法,主要存储每个字符的前后缀的值;
// KMP 算法,求 next 数组
void get_next(char t[MaxSize + 1], int nextval[]) {
int i, k;
i = 1, k = 0;
next[1] = 0;
while (i < t[0]) // t[0] 储存的是字符串的长度
{
if (k == 0 || t[i] == t[k]) {
i++;
k++;
next[i] = k;
} else {
k = next[k]; // 否则 k 值回溯
}
}
}
// KMP 算法主体
int KMP_match(char text[MaxSize + 1], char keys[MaxSize + 1], int start) {
int i = start, j = 1;
while (i <= text[0] && j <= keys[0]) {
if (j == 0 || text[i] == keys[j]) {
i++;
j++;
} else {
j = next[j];
}
}
// 判断目标单词最后一个字母的后一位是否为字母
if (j > keys[0] && (text[i + 1] < 0x61 || text[i + 1] > 0x7A)) {
return (i - keys[0]);
} else {
return 0;
}
}
```
其中,`get_next` 函数用于求解模式串 `t` 的 next 数组,即每个字符的前缀和后缀的最长公共长度。`KMP_match` 函数用于在文本串 `text` 中查找模式串 `keys` 的出现位置,`start` 参数表示查找起始位置。在查找过程中,使用 `next` 数组实现字符串匹配。如果匹配成功,且目标单词最后一个字母的后一位不是字母,则返回目标单词在文本串中的起始位置;否则返回 0。
while(!feof(fp)) { k=0; fgets(&text[1],MaxSize,fp); text[0]=length(text); j=KMP_match(text,keys,j+1);修改bug
在这段代码中,使用 `fgets` 函数读取文件内容时,第二个参数传递的是 `MaxSize`,这个值可能比实际读取的行字符数要大,因此需要在读取完内容后,手动判断是否读取到了文件结尾。同时,在每次读取完一行内容后,需要将 `j` 的初始值重置为 0,否则可能会影响下一次匹配的结果。修改后的代码如下:
```
while (fgets(&text[1], MaxSize, fp)) {
text[0] = length(text);
j = 0; // 重置 j 的初始值为 0
j = KMP_match(text, keys, j + 1);
}
```
这样就可以解决这段代码的 bug 了。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)