C++一道期中题,请给个思路.

来源:百度知道 编辑:UC知道 时间:2024/06/14 09:43:34
字符串综合练习:编写一个简单行编辑程序,对文本文件进行插入、删除等修改操作。要求实现以下功能:
(1)行插入
(2)行删除
(3)改变当前行指针
(4)基于KMP算法进行查找和替换

行缓冲方式读入一行,删除的话也是,把这行从缓冲中删去,后面的行连接上来。

我现在才刚开始学c语言呢,被指针搞得一塌糊涂,改天你教教我吧,别生气哦!!

在C/C++语言编程过程中,一般的字符串搜索操作都是通过标准库的strstr()函数来完成的,这在通常的情况下,因为字符串的搜索操作不多,并不会产生效率问题。实际上,这个函数的时间复杂度不容乐观。如果要从长度为n的字符串中查找长度为m的子字符串,那么这个strstr()函数的最坏时间复杂度为O(n*m),可见,随着子字符串长度m的增大,strstr()函数的时间复杂度也相应地成倍增加,有没有更加高效的算法呢?

KMP(Knuth-Morris-Pratt)算法通过预先计算模式字符串中相应字符处的回溯索引,避免了模式匹配时不必要的回溯操作,从而提高了效率,将时间复杂度变成了O(m+n)。至于更加详细的内容,请教Google老师是个不错的主义,其中“KMP算法详解”这篇文章讲解的比较透彻,值得一看。

KMP算法因为要保存每个字符的回溯索引,所以空间复杂度会略微有所增加

sizeof(idx)*length(pattern)

另外,当n比较小时,建立回溯索引所引入的O(m)个时间复杂度也许并不轻松。这些条件致使KMP算法适用于n和m都比较大,且字符串搜索操作比较频繁的环境,例如:网络入侵检测系统和QoS系统等。

实际上Linux 2.6版内核从2.6.14开始就引入了名为string的iptables匹配(match)模块,他提供有KMP、BM(Boyer-Moore)和FSM(finite state machine)算法,可以实现基于关键字的网络过滤。

在学习这个算法的过程中,将Linux内核中的实现代码搬到了用户空间:

#include <assert.h>
#include <stdio.h>

void kmp_init(const char *patn, int len, int *next)
{
int i, j;

assert(pa