文本编辑器-字符串与文件的应用

Lua学习:字符串函数与模式匹配 Lua是一种轻量级的脚本语言,广泛应用于嵌入式系统、游戏开发和脚本编程等领域。在Lua中,字符串处理是一个常见的任务。本文将介绍Lua中的字符串函数和模式匹配,并提供相应的源代码示例。通过使用字符串函数和模式匹配,可以轻松地处理和操作字符串。这些功能在处理文本数据、解析文件等场景中非常有用。希望本文对你的Lua学习有所帮助!如有任何问题,请随时提问。 阅读详情

一、引入问题:

二、代码:

 1. DevC++版本:

#include<iostream>
#include<cstdio>
#include<cstring> 
#include<fstream> 
#include<vector>
using namespace std;
const int N=1e5+5;


vector<int> KMP(const string& S, const string& T)
{
	int i=0,j=0;
    vector<int> Next;
    Next.push_back(-1);

    for (i = 0, j = -1; i < T.size();) {
        if (j == -1 || T[i] == T[j]) {
            i++, j++;
            if (i != T.size() && T[j] == T[i]) Next.push_back(Next[j]);
            else Next.push_back(j);
        }
        else j = Next[j];
    }

    vector<int> res;
	
    for (i = 0, j = 0; i < S.size() && j < (int)T.size();) {
        if (j == -1 || S[i] == T[j]) {
            i++, j++;
            if (j == T.size()) {
                res.push_back(i - j);
                j = Next[j];
            }
        }
        else j = Next[j];
    }

    return res;
}
//从文件中获取所有字符,存入char[] 
void GetWords(char *a){
	FILE *fp;
	while( (fp = fopen("text.txt","r")) == NULL ) {
		printf("不能打开文件text.txt\n");
        return;
	}
	int index = 0;	
	char ch = fgetc(fp);
	while(ch != EOF) {
		a[index++] = ch;
		ch = fgetc(fp);
	}
	a[index] = '\0'; 
}

int main() {
	char a[100000];
	cout<<"显示文章:"<<endl; 
	GetWords(a);
	cout<<a<<endl<<endl;
	while(1) {
		cout<<"功能:1-查找,2-替换并存档"<<endl<<"请输入功能编号:";
		int f;
		cin>>f;
		if(f==1){
			std::string sc;
			cout<<"请输入要查找的指定字符串:"<<endl; 
			cin>>sc;
			string sf = a;
			vector<int> v;
			v = KMP(sf,sc);
			cout<<"其出现次数:"<<v.size()<<endl;
//			for(vector<int>::size_type i = 0; i != v.size(); i++) {
//				
//			}
//			char sc[10000];
//			cout<<"请输入要查找的指定字符串:"<<endl; 
//			cin>>sc;
//			int len1 = strlen(sc);
//			int len2 = strlen(a);
//			cout<<"其出现次数:"<<kmp(len1,len2,sc,a)<<endl;
			cout<<endl;
		} else if(f==2){
			int i=0;
			string sc;
			cout<<"请输入[被替换]的指定字符串"<<endl;
			cin>>sc;
			string sf = a;
			vector<int> v;
			v = KMP(sf,sc);
			
			cout<<endl<<"找出子串在主串中出现的所有位置:"; 
			for(vector<int>::size_type i = 0; i != v.size(); i++) {
				cout<<v[i];
				if(i != v.size()-1) cout<<","; 
			}
			cout<<endl;

			cout<<"请输入[替换]的指定字符串"<<endl; 
			string sn;
			cin>>sn;
			int lenc = sc.length();
			int lenf = sf.length();
			int lensn = sn.length();
			
			string newText;
			for( i=0;i<lenf;i++) {
				int flag = 1;
				for(vector<int>::size_type j = 0; j != v.size(); j++) {
					if(v[j] == i) {
						flag = 0; //表示当前为所有位置之一
						break; 
					}	
				}
				if(flag) newText += sf[i];
				else {
					newText += sn;
					i+= (lensn-1);
				}
			}
			cout<<endl<<"替换后的文章为:"<<endl;
			cout<<newText<<endl;
			
			FILE* fp = fopen("newtext.txt", "w");
			int a = fwrite(newText.c_str(), sizeof(char), strlen(newText.c_str()), fp);
			fclose(fp);//关闭文件并保存
			cout<<"替换后的文章保存到newtext.txt成功!"<<endl; 
			
			cout<<endl;
		} else if(f == -1){
			break;
		} else {
			cout<<"请重新输入! "<<endl; 
		}
	}
	return 0;
} 

2. VC++版本:(头文件string、string.h、cstring的不同是导致的原因之一。)

#include<iostream>
#include<cstdio>
#include<string> 
#include<fstream> 
#include<vector>
using namespace std;
const int N=1e5+5;


vector<int> KMP(const string& S, const string& T)
{
	int i=0,j=0;
    vector<int> Next;
    Next.push_back(-1);

    for (i = 0, j = -1; i < T.size();) {
        if (j == -1 || T[i] == T[j]) {
            i++, j++;
            if (i != T.size() && T[j] == T[i]) Next.push_back(Next[j]);
            else Next.push_back(j);
        }
        else j = Next[j];
    }

    vector<int> res;
	
    for (i = 0, j = 0; i < S.size() && j < (int)T.size();) {
        if (j == -1 || S[i] == T[j]) {
            i++, j++;
            if (j == T.size()) {
                res.push_back(i - j);
                j = Next[j];
            }
        }
        else j = Next[j];
    }

    return res;
}
//从文件中获取所有字符,存入char[] 
void GetWords(char *a){
	FILE *fp;
	while( (fp = fopen("text.txt","r")) == NULL ) {
		printf("不能打开文件text.txt\n");
        return;
	}
	int index = 0;	
	char ch = fgetc(fp);
	while(ch != EOF) {
		a[index++] = ch;
		ch = fgetc(fp);
	}
	a[index] = '\0';
}

int main() {
	char a[100000];
	cout<<"显示文章:"<<endl; 
	GetWords(a);
	cout<<a<<endl<<endl;
	while(1) {
		cout<<"功能:1-查找,2-替换并存档"<<endl<<"请输入功能编号:";
		int f;
		cin>>f;
		if(f==1){
			std::string sc;
			cout<<"请输入要查找的指定字符串:"<<endl; 
			cin>>sc;
			string sf = a;
			vector<int> v;
			v = KMP(sf,sc);
			cout<<"其出现次数:"<<v.size()<<endl;
			cout<<endl;
		} else if(f==2){
			//int i=0;
			string sc;
			cout<<"请输入[被替换]的指定字符串"<<endl;
			cin>>sc;
			string sf = a;
			vector<int> v;
			v = KMP(sf,sc);
			
			cout<<endl<<"找出子串在主串中出现的所有位置:"; 
			for(vector<int>::size_type i = 0; i != v.size(); i++) {
				cout<<v[i];
				if(i != v.size()-1) cout<<","; 
			}
			cout<<endl;

			cout<<"请输入[替换]的指定字符串"<<endl; 
			string sn;
			cin>>sn;
			int lenc = sc.length();
			int lenf = sf.length();
			int lensn = sn.length();
			
			string newText;
			for( i=0;i<lenf;i++) {
				int flag = 1;
				for(vector<int>::size_type j = 0; j != v.size(); j++) {
					if(v[j] == i) {
						flag = 0; //表示当前为所有位置之一
						break; 
					}	
				}
				if(flag) newText += sf[i];
				else {
					newText += sn;
					i+= (lensn-1);
				}
			}
			cout<<endl<<"替换后的文章为:"<<endl;
			cout<<newText<<endl;
			
			FILE* fp = fopen("newtext.txt", "w");
			int a = fwrite(newText.c_str(), sizeof(char), strlen(newText.c_str()), fp);
			fclose(fp);//关闭文件并保存
			cout<<"替换后的文章保存到newtext.txt成功!"<<endl; 
			
			cout<<endl;
		} else if(f == -1){
			break;
		} else {
			cout<<"请重新输入! "<<endl; 
		}
	}
	return 0;
} 

 三、测试:

 原文章:

替换后的文本存档: 

4、字符串处理基础 本博客深入探讨了字符串处理的基础知识与高级技术,涵盖了子串提取、字符串连接、编辑操作、模式匹配等核心概念。通过详细的流程图和示例代码,展示了字符串处理的具体实现方法,并介绍了多未知数捕获、复杂模式匹配、字符串转换等高级技术。此外,还讨论了如何优化字符串处理算法以提高效率,以及字符串在实际场景中的广泛应用,如文本编辑器、数据解析、文件内容替换和日期格式转换等。无论是初学者还是进阶开发者,都能从中掌握实用的字符串处理技能。 阅读详情

相关推荐

C++的ASCII码文件和串函数实现的文本编辑器

C++的ASCII码文件和串函数实现的文本编辑器.运用双链命令行中指定输入文件名、输出文件名(文本文件); 将输入文件打开,读入输入缓冲区; 对输入缓冲区中的文件内容进行编辑,包括:显示当前文件内容、到第一行、到最后一行、到前一行、到下一行、到指定的某一行、插入一行、删除一行、替换当前行、替换某个子串、查找指定的某个子串、统计文件行数及字符数、重新读入文件、保存当前文件、退出系统等操作

串操作应用举例(文本编辑)

// algo4-2.cpp 文本行编辑 #include"c1.h" #include"c4-2.h" // 采用串的堆分配存储结构 #include"bo4-2.cpp" // 串的堆分配基本操作 #define MAX_LEN 25 // 文件最大行数 #define LINE_LEN 75 // 每行字符数最大值+1 #define NAME_LEN 20 // 文件名最大长度(包...

weixin_30455023的博客 768

文本编辑即字符串处理程序

该代码详细的注释,让程序清晰易懂,完备的功能,规范的格式,是初学者极好的学习示例

用字符串做一个文本编译器

#include #define LINE 50      定义行 #define MAX  100       定义列 int main() {     char arr[LINE][MAX]={0};      int i=0;      for(i=0;i        {      gets(arr[i]);        if(arr[i][0]=='\0')

shui_yu_zheng_feng的博客 413

ORB-SLAM3单目摄像头

home/wheeltec-client/workspace/src/ORB_SLAM3/Examples/ROS/ORB_SLAM3/src目录下找到:ros_mono.cc文件,打开找到并修改成我们自己摄像头的订阅话题(usb_cam/imahe_raw)即相机设置文件,官方提供的是Asus.yaml,可以另复制命名一个文件My_camera.yaml,将里面的相机参数修改成自己标定过的参数。sudoaptinstalllibeieng3-dev#命令安装的版本是eigen。

疯狂的石头 742

结构力学程序算法理论基础(一)————虚功原理

1.约束 定义约束:限制质点或者质点系运动的条件称为约束,表示这些限制条件的数学方程称为约束方程。 (1)几何约束 限制质点或者质点系在空间的几何位置的条件称为几何约束.如单摆,其中质点M可绕固定点O在平面Oxy内摆动,摆长为l.这时摆杆对质点的限制条件是:质点M必须在以点O为圆心,以l为半径的圆周上运动.其约束方程为: 又质点M在固定的曲面上运动,那么曲面方程就是质点M的约束方程,即 上...

l93919861的博客 4511

33.讲字符串匹配基础(中):如何实现文本编辑器中的查找功能

问题:对于查找功能是重要功能的软件来说,比如一些文本编辑器,它们的查找功能都是用哪种算法来实现的呢?有没有比BF算法和RK算法更加高效的字符串匹配算法呢?

tobebetter9527的博客 770

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规考试的试题解析,内容涵盖《个人信息保护法》相关规定。试卷包含单选题、多选题、判断题、简答题和案例分析题五种题型,总分100分,考试时间120分钟。试题重点考察个人信息处理的基本原则、敏感个人信息处理要求、合规审计流程、个人信息保护影响评估等内容。通过案例分析题详细解析了人脸识别登录、数据共享、跨境传输等场景下的合规要求。参考答案均严格依据《个人信息保护法》等法律法规,为个人信息处理活动提供了明确的合规指引。

qq_41525079的博客 850

简单文本编辑器

v一、前言   聚天地之灵气,集日月之精华!一个简单的java文本编辑器由此而生。毕设所需,很是无奈! v二、界面预览 v三、实现思路 v  1.字体选择器的实现   (1).字体类 View Code   (2).字体选择器 View Code v  2.编辑器的实现   (1).字符串样式修饰类     功能:主要是...

weixin_34418883的博客 199

stm32控制舵机_使用URT-1控制飞特舵机上手教程(SM40BL舵机为例)

使用URT-1控制飞特舵机上手教程(SM40BL舵机为例):1,参阅URT-1使用说明.pdf2, 材料清单:① URT-1驱动板② 连接驱动板与电脑的MINI USB 连接线③ 给舵机供电的电源④ 舵机与舵机连接线⑤ 杜邦线(可选)3,将URT-1驱动板与电脑连接4,安装驱动,参阅文件CH340驱动,检查设备管理器串口号。5,舵机连接URT-1驱动板,驱动板接电源,参考下图:6,打开FD软件进行...

weixin_39564510的博客 3432

喷涂机器人系列编程:ABB IRB 5500_(7).喷涂质量控制与优化

通过编程手段对ABB IRB 5500喷涂机器人进行质量控制和优化,可以显著提高喷涂的均匀性和附着力,减少涂层缺陷。具体的方法包括喷涂参数的调整、路径规划的优化、喷涂效果的检测与反馈,以及喷涂参数的动态调整。综合评估系统可以进一步确保喷涂质量的稳定性和一致性,帮助汽车制造企业提高产品质量和生产效率。

zhubeibei168的博客 851

awk sub和gsub区别及用法

&lt;div class="iteye-blog-content-contain" style="font-size: 14px"&gt;&lt;/div&gt;  awk -F '|'  '{sub(/[0-9]+/,"",$2);print $0}' data.test  三。sub和gsub的区别sub匹配第一次出现的符合模式的字符串,相当于 sed 's//'   。gsub匹配所...

Chung 1489

YOLO11涨点优化:损失函数优化 | 引入MPDIoU,利用边界框左上角和右下角距离,彻底解决重叠框匹配失效问题

【摘要】针对目标检测中重叠框匹配失效问题,本文提出基于MPDIoU损失函数的解决方案。MPDIoU通过同时约束边界框的左上角和右下角两点距离,有效解决了传统IoU损失在重叠场景下的优化歧义问题。文章首先分析YOLO系列在密集目标检测中的性能瓶颈,指出GIoU/CIoU等现有方法无法区分相同IoU值但偏移方向不同的预测框。随后详细解析MPDIoU的数学原理及其相对于主流损失函数的优势,证明两点距离约束能提供唯一优化方向。最后给出在YOLO11中实现MPDIoU的具体方案,包括核心代码修改点和架构适配建议。实验

2601_95807009的博客 172

python读取最新文件_python读写更新替换文件内容

# 传入文件(file),将旧内容(old_content)替换为新内容(new_content)def replace(file, old_content, new_content):content = read_file(file)content = content.replace(old_content, new_content)rewrite_file(file, content)# 读文...

weixin_39531378的博客 589

Android TV 遥控器全链路按键适配指南:从物理按键到应用响应

本文深入探讨了Android TV遥控器按键适配方案,涵盖红外和蓝牙遥控器的工作原理及完整适配流程。红外遥控部分详细介绍了从硬件调试、驱动适配到键值映射配置的方法,并提供了实用的调试命令。蓝牙遥控器部分解析了HID协议和报告描述符,给出内核层与Android层的适配代码示例。文章还介绍了游戏手柄、语音遥控器等特殊外设的适配技巧,并提供了系统级调试工具和内核级调试方法,为开发者提供了一套完整的Android TV输入设备适配解决方案。

学无止境 1266

学Simulink--人形机器人控制场景实例:基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真

matlab编辑% 连杆长度 (m)% 躯干(髋到CoM)% 大腿% 小腿% 质量 (kg)% 转动惯量(绕质心,简化为杆)matlab编辑% 躯干CoM(假设在髋上方L_body/2处)% 左大腿CoM% 左小腿CoM% (右腿类似,略)本文完成了基于Simulink的多连杆人形机器人拉格朗日动力学建模仿真,实现了:✅ 定义7-DOF平面人形结构✅ 使用Symbolic Math Toolbox自动推导动力学方程✅ 生成。

amy_mhd的博客 397

数据结构第一弹-字符串处理

在不同的编程语言中,字符串的内部表示方式可能有所不同,但大多数现代语言都支持Unicode编码,以适应全球多种语言的需求。KMP算法是一种高效的字符串匹配算法,其核心思想是利用已经部分匹配的信息避免重复计算。字符串处理是计算机科学领域的一个重要课题,涉及到许多复杂的算法和技术。暴力法是最直接的字符串匹配方法,它通过逐个字符比较的方式找到子串的位置。简单的字符串压缩可以通过统计连续相同字符的数量来实现。

fengxiaotao_cool的专栏 826

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

QT提取文件中单个字符串

char* keyword=NULL;     if(kwdata->getChar(keyword) == true)     {        QString keywordstr=keyword;        qDebug()        HighLightKw(ui->VideoRes->document(),keywordstr);     }     else

helen0713的专栏 1654

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

delphi 入门教程

引用:http://huihua.hebtu.edu.cn/hhcmc/study/program/delphi1/ DELPHI基础教程 第一章 Delphi快速入门(一) 第一章 Delphi快速入门(二) 第一章 Delphi快速入门(三) 第一章 Delphi快速入门(四) 第一章 Delphi快速入门(五) 第二章 Delphi面向对象的...

weixin_30257433的博客 151

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Python零基础】正则表达式与操作文件

正则表达式是处理字符串的强大工具,配合Python的re库,能实现匹配、提取、替换等多种操作,尤其适合日志解析、数据清洗等场景。

m0_73902570的博客 1026

用re.split()处理复杂数据清洗?这份Python文件路径与字符串分割的保姆级教程请收好

本文详细介绍了如何使用Python的`re.split()`方法处理复杂数据清洗任务,特别是文件路径与字符串分割场景。通过正则表达式的强大功能,`re.split()`能高效处理多分隔符、中文混合字符串等复杂情况,提升数据处理的灵活性和效率。教程包含基础用法、实战技巧和性能优化建议,是数据清洗的实用指南。

weixin_30316097的博客 413

Python字符串处理全解析:从基础操作到正则表达式实战

字符串处理是编程中的基础核心技能,涉及文本数据的创建、访问、转换与分析。其原理基于字符串作为不可变序列的特性,通过索引、切片及丰富内置方法实现高效操作。掌握字符串处理技术对于数据清洗、日志分析、用户输入验证等场景具有重要价值,能显著提升开发效率与代码质量。本文聚焦Python字符串的核心方法如split()、join()、replace(),并结合正则表达式等进阶技巧,通过典型应用场景解析,帮助读者构建系统的文本处理能力,告别单纯寻找“头歌python答案”的学习模式,真正掌握问题拆解与工具组合的工程思维。

weixin_33845881的博客 727

Python字符串处理实例详解

问题:在程序中我们将各个参数按次序收集到列表中: ["<0112>", "<32>","<1024x768>","<60>" ],要把各个参数拼接成数据报进行发送"<0112><32><1024x768><60>"解决方案: 使用字符串中的str.startswith()和end.startswith()方法 (注意:多个匹配时参数使用元组)方法一: 字符串strip(),lstrip(),rstrip()方法去掉字符串两端字符。方法二:使用str.join()方法,更加快速的拼接列表中所有字符串。

m0_74824865的博客 207

python数字对应的编码_Python之字符编码(一)

一、了解字符编码的知识储备?1、计算机基础知识?计算机中所有的软件文件(包括:操作系统)都存储在硬盘,启动计算机,计算机需要把系统文件都去到内存中。2、文本编辑器存取文件的原理(nodepad++、pycharm、word)打开编辑器就启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放在内存中,断电后数据丢失。想要永久保存,需要把内存中的数据刷到硬盘上。编写一个py文件(没有执行),...

weixin_39533052的博客 154

从文本编辑器到病毒扫描:BM算法在真实世界里的高效应用(附C++代码示例)

本文深入探讨了BM算法在文本编辑器和病毒扫描中的高效应用,通过C++代码示例展示了其核心优势。BM算法凭借坏字符规则和好后缀规则,在字符串匹配领域树立了性能标杆,特别适合短模式串和长文本串的场景。文章还介绍了Turbo-BM优化和多模式匹配等高级技巧,帮助开发者提升算法效率。

weixin_30873847的博客 594
上一篇: 数组实现多项式加减乘-C
下一篇: Jsp-(表单)文件上传
ଳxin
博客等级 码龄8年 83粉丝 197原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值