在devc++中,对顺序串类型进行定义,用malloc函数为空顺序串分配存储空间,建立一个空顺序串,用scanf函数输入一串任意字符串,用KMP算法实现字符串的快速模式匹配的完整代码
时间: 2024-10-29 08:21:13 浏览: 7
C语言中函数返回字符串的方法汇总
在Dev-C++中,首先我们需要定义一个顺序串类型(通常是字符数组),然后使用`malloc()`动态分配内存。以下是一个简单的例子展示了如何创建一个空顺序串,接收用户输入,并用Knuth-Morris-Pratt (KMP) 算法进行字符串匹配的步骤:
```cpp
#include <iostream>
#include <cstring>
#include <string.h>
// 定义顺序串结构体
struct Sequence {
char* data;
int length;
};
// 动态分配存储空间并初始化空顺序串
Sequence createEmptyString() {
Sequence s;
s.data = new char[1];
s.length = 0;
s.data[0] = '\0'; // 设置初始结束符
return s;
}
// KMP算法辅助函数 - 计算部分匹配表
void computePrefixTable(const char* pattern, int prefix[], int n) {
int i = 1, j = 0;
prefix[0] = -1;
while (i < n) {
if (pattern[i] == pattern[j])
prefix[i++] = ++j;
else if (j != 0)
j = prefix[j - 1];
else
i++;
}
}
// 使用KMP算法进行模式匹配
bool kmpMatch(const char* text, const char* pattern, int prefix[]) {
int i = 0, j = 0;
while (i < strlen(text)) {
if (text[i] == pattern[j]) {
i++, j++;
} else if (j != 0) {
j = prefix[j - 1];
} else {
i++;
}
if (j == strlen(pattern))
return true; // 找到了匹配
}
return false;
}
int main() {
Sequence text = createEmptyString();
// 输入文本串
std::cout << "Enter a string: ";
char inputText[100];
scanf("%s", inputText);
text.length = strlen(inputText);
text.data = (char*) realloc(text.data, text.length + 1); // 增加空间
strcpy(text.data, inputText);
// 用户输入模式串
char inputPattern[100];
std::cout << "Enter the pattern to search: ";
scanf("%s", inputPattern);
// 创建前缀表
int patternLength = strlen(inputPattern);
int prefix[patternLength];
computePrefixTable(inputPattern, prefix, patternLength);
// 检查模式匹配
bool found = kmpMatch(text.data, inputPattern, prefix);
if (found)
std::cout << "Pattern found in the text.\n";
else
std::cout << "Pattern not found in the text.\n";
// 清理内存
free(text.data);
text.data = NULL;
return 0;
}
```
阅读全文