ch04 String
51单片机控制串口热敏打印机程序

#include<reg52.h> //51头文件#include<string.h> //字串处理函数头文件//#include<math.h>#define uchar unsigned charsbit BUSY=P3^4; //并口打印机的BUSY,串口打印机的CTS/**************************单字节打印函数************************************/void print(unsigned char ch){while (BUSY==1) //busy为1时,等待,如数据量小,可不判BUSY{;}SBUF= ch; //busy=0,将数据送到P1口while(TI==0) //当TI为0时,表示数据未发送完成,一直等待,直到为1{;}TI=0; //将TI清0}/*********************串口初始化**********************************************/void com_init(void){TH1=0XFD; //波特率值装入计数器,9600BPSTMOD=0X20; //串口设置,定时器1,设为方式2,8位自动重载,用于产生波特率SCON=0X50; //串口发送方式1,8位数据位,1位停止位TR1=1; //开启定时器1}/**********************字符打印函数********************************************/ void print_chs(uchar ch[]){uchar i;for(i=0;i<strlen(ch);i++) //应用到字串处理函数,故须调用print(ch[i]);}/*************************汉字打印例程***************************************/void hanzitest(void){//uchar i;print(0x1b);print(0x40); //初始化打印机print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24print(0x1b);print(0x31);print(6); // 设置后面的内容行间距为6点,默认为n = 3;print_chs("操作人:\n");print(0x0d);print_chs("仪器编号:\n");print(0x0d);print_chs("操作日期:2015年3月12日\n");print(0x0d);print_chs("工序四时间:\n");print(0x0d);print_chs("工序三时间:\n");print(0x0d);print_chs("工序二时间:\n");print(0x0d);print_chs("工序一时间:\n");print(0x0d);/*for(i=0;i<1;i++) //搋环打印5次{print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24//print(0x1b);print(0x38);print(0x04); //调用12*12点阵汉字,24点阵为24*24print(0xc8);print(0xd9);print(0xb4);print(0xef); //打印数据“荣达”print(0x0d); //回车}*/}/*************************左限例程**********************************/void zuoxian(void){print(0x1b);print(0x40); //初始化打印机print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24//print_chs("左限测试:\n");//print_chs("12345678901234567890123456789012");//标尺print(0x1b);print(0x6c);print(0x06); //ESC I 命令,左限为6//print(0x1b);print(0x69);print(1); //设置下面的文字为反白打印。
ch04

例4.1 格式控制字符的应用。
main(){int m=65,n=90;printf("%d %d\n",m,n); /*输出用空格隔开*/printf("%d,%d\n",m,n); /*输出用逗号隔开*/printf("%c,%c\n",m,n); /*可以用字符形式输出*/printf("m=%d,n=%d\n",m,n); /*有普通字符*/printf("m=%o,n=%o\n",m,n); /*以八进制格式输出*/printf("m=%x,n=%x\n",m,n); /*以十六进制格式输出*/}运行结果:65 9065,90A,Zm=65,n=90m=101,n=132m=41,n=5as格式符用来输出字符串。
例如:printf("%s","dog");输出dog字符串。
例4.2 输出格式符实例。
void main(){int a=15;float b=138.3576278;double c=35648256.3645687;char d='c';int e=-12;float f=123.45;printf("a=%d,%5d,%o,%x\n",a,a,a,a);printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);printf("c=%lf,%f,%8.4lf\n",c,c,c);printf("d=%c,%4c,%-3c\n",d,d);printf("e=5d,%u,%-3u\n",e,e,e);printf("f=%e,%-2e,%3.1e+0.2e\n",f,f,f,f);printf("g=%g,%-2g,%3.1g\n",f,f,f);printf("s=%s,%12s,%3s,%4.5s,%4.3s\n","happy"," happy", "happy","happy","happy");}运行结果:a=15,︼︼︼15,17,fb=138.357628,138.357628,138.3576,1.38358e+02c=35648256.364569,35648256.364569,35648256.3646d=c, ︼︼︼c,ce=︼︼-12,65524,65524f=12.345,1.23450e+01,1.23450e+01,1e+01+0.2eg=1.2345,12.345, ︼10s=happy, ︼︼︼︼︼︼︼happy,happy,happy, ︼hap例4.3 scanf函数的应用。
C#中string.format用法详解

C#中string.format⽤法详解String.Format ⽅法的⼏种定义:String.Format (String, Object) 将指定的 String 中的格式项替换为指定的 Object 实例的值的⽂本等效项。
String.Format (String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的⽂本等效项。
String.Format (IFormatProvider, String, Object[]) 将指定 String 中的格式项替换为指定数组中相应 Object 实例的值的⽂本等效项。
指定的参数提供区域性特定的格式设置信息。
String.Format (String, Object, Object) 将指定的 String 中的格式项替换为两个指定的 Object 实例的值的⽂本等效项。
String.Format (String, Object, Object, Object) 将指定的 String 中的格式项替换为三个指定的 Object 实例的值的⽂本等效项。
常⽤的格式化数值结果表字说明⽰例输出符C货币string.Format("{0:C3}", 2)$2.000D⼗进制string.Format("{0:D3}", 2)002E科学计数法 1.20E+001 1.20E+001G常规string.Format("{0:G}", 2)2string.Format("{0:N}", 250000)250,000.00N⽤分号隔开的数字X⼗六进制string.Format("{0:X000}", 12)Cstring.Format("{0:000.000}",012.20012.2)常⽤的⼏种实例1、字符串的数字格式string str1 =string.Format("{0:N1}",56789); //result: 56,789.0string str2 =string.Format("{0:N2}",56789); //result: 56,789.00string str3 =string.Format("{0:N3}",56789); //result: 56,789.000string str8 =string.Format("{0:F1}",56789); //result: 56789.0string str9 =string.Format("{0:F2}",56789); //result: 56789.00string str11 =(56789 / 100.0).ToString("#.##"); //result: 567.89string str12 =(56789 / 100).ToString("#.##"); //result: 5672、格式化货币(跟系统的环境有关,中⽂系统默认格式化⼈民币,英⽂系统格式化美元)string.Format("{0:C}",0.2)结果为:¥0.20 (英⽂操作系统结果:$0.20)默认格式化⼩数点后⾯保留两位⼩数,如果需要保留⼀位或者更多,可以指定位数string.Format("{0:C1}",23.15)结果为:¥23.2 (截取会⾃动四舍五⼊)格式化多个Object实例string.Format("市场价:{0:C},优惠价{1:C}",23.15,19.82)3、格式化⼗进制的数字(格式化成固定的位数,位数不能少于未格式化前,只⽀持整形)string.Format("{0:D3}",23) //结果为:023string.Format("{0:D2}",1223) //结果为:1223,(精度说明符指⽰结果字符串中所需的最少数字个数。
JAVAAPI(一)String类和StringBuffer类

⽅法声明 功能描述int indexOf(int ch)返回指定字符在此字符串中第⼀次出现处的索引int lastIndexOf(int ch)返回指定字符在此字符串中最后⼀次出现处的索引int indexOf(String str)返回指定⼦字符串在此字符串中第⼀次出现处的索引int lastIndexOf(String str)返回指定⼦字符串在此字符串中最后⼀次出现处的索引char charAt(int index)返回字符串中index 位置上的字符,其中,index 的取值范围是0-(字符串长度-1)boolean endsWith(String suffix)判断此字符串是否以指定的字符串结尾int length()返回此字符串的长度boolean equals(Object anObject)将此字符串与指定的字符串⽐较boolean isEmpty()当且仅当字符串长度为0时返回true boolean startsWith(String prefix)判断此字符串是否以指定的字符串开始boolean contains(CharSequence cs)判断此字符串中是否包含指定的字符序列String toLowerCase()使⽤默认语⾔环境的规则将String 中的所有字符都转换为⼩写String toUpperCase()使⽤默认语⾔环境的规则将String 中的所有字符都转换为⼤写static String valueOf(int i)返回int 参数的字符串表⽰形式char[] toCharArray()将此字符串转换为⼀个字符数组String replace(CharSequence oldstr,CharSequence newstr)返回⼀个新的字符串,它是通过⽤newstr 替换此字符串中出现的所有oldstr 得到的String[] split(String regex)根据参数regex 将原来的字符串分割为若⼲⼦字符串JAVAAPI (⼀)String 类和StringBuffer 类1.String 类和StringBuffer 类在程序中经常会⽤到字符串,所谓的字符串就是指⼀连串的字符,它是由多个单个字符连接⽽成的。
JasperReports_3.5_ch04

4从数据库创建动态报表在前面的章节中,我们学习了如何创建第一份报表。
在那个简单的报表中,没有包含动态数据。
在本章中,我们将介绍怎样用数据库中的数据来创建报表。
本章主要内容包括:•怎样在定义的报表中嵌入SQL查询•怎样通过数据源来传递SQL查询返回的数据行•怎样使用报表域在报表中显示来自数据库的数据•怎样通过JRXML模板的<textField>元素显示来自数据库的数据数据源数据源被JasperReports用来获取生成报表的数据。
数据可以是存放在数据库、XML文件、对象数组、对象集合中。
本章主要讨论数据库相关的数据源,其它类型的数据源将在下一章中介绍。
生成报表的数据库我们将用MySQL数据库来存放生成报表用的数据,从 可以下载到本文中使用的MySQL数据文件。
这份数据是公用的,其原始大小为1.3G。
所以,我们删除了其中许多数据表和大量的数据,以使其尺寸变得适合下载。
裁剪后的MySQL数据备份文件,也是本书的随书代码的一部分。
可以从/files/code/8082_Code.zip下载得到它。
此flightstats数据库中包含了下列数据表:•Aircraft•aircraft_models•aircraft_types•aircraft_engines•aircraft_engine_types下图给出了数据库的结构:FlightStats数据库使用MySQL数据库缺省的MyISAM 存储引擎,它不支持外键引用,这也正是我们在上图的表和表这间看不到任何表示数据表之间依赖关系的箭头的原因。
下面,让我们来创建一份报表,显示数据库中1000马力以上的大型飞机。
报表将显示飞机的尾数(tail number)、序号(serial number)、飞机型号(model)和飞机引擎型号(engine model)。
下面的查询用于获取这些结果:SELECT a.tail_num, a.aircraft_serial, am.model as aircraft_model,ae.model AS engine_modelFROM aircraft a, aircraft_models am, aircraft_engines aeWHERE a.aircraft_engine_code in (select aircraft_engine_codefrom aircraft_engineswhere horsepower >= 1000)and am.aircraft_model_code = a.aircraft_model_codeand ae.aircraft_engine_code = a.aircraft_engine_code以上查询从数据库获取的数据如下所示:生成数据库报表有两种方法来生成数据库报表,把SQL查询嵌入到JRXML报表模板中,或者通过数据源从数据库传递数据到编译后的报表中。
JSP Web应用开发案例教程课件第四章

实例代码如下:
4.1 request对象
15
4.1.3 使用request对象获取用户提交的信息
<%@page contentType="text/html;charset=gb2312"%>
A request对象 B response对象 C out对象 D application对象 E session对象
5
4.1 request对象
4.1 request对象
6
4.1.1 request对象的常用方法
在JSP中,内置对象request封装了用户提交到服务器端的数据,调用该对象的相关方 法可以获取封装的信息。request对象的常用方法有很多,下面简单介绍一下。
4.1 request对象
13
4.1.2 request对象的应用
程序运行效果如图4-1所示。
图4-1 使用request对象获取的信息
4.1 request对象
14
4.1.3 使用request对象获取用户提交的信息
使用request对象获取用户信息最常用的 方法是getParameter(String s),下面通 过实例简单介绍。
while(enu.hasMoreElements()){ String Name = (String)enu.nextElement(); String value = (String)request.getParameter(Name);
} %>
</body> </html>
string.h 函数
string.h是C 语言标准库中的一个头文件,它包含了处理字符串的函数。
以下是一些在string.h中常见的函数:1.strcpy(): 复制一个字符串到另一个字符串。
c复制代码char *strcpy(char *dest, const char *src);2.strcat(): 将一个字符串附加到另一个字符串的末尾。
c复制代码char *strcat(char *dest, const char *src);3.strlen(): 返回一个字符串的长度(不包括终止字符)。
c复制代码size_t strlen(const char *s);4.strcmp(): 比较两个字符串。
c复制代码int strcmp(const char *s1, const char *s2);5.strchr(): 在字符串中查找第一个出现的指定字符。
c复制代码char *strchr(const char *s, int c);6.strstr(): 在字符串中查找子字符串的首次出现。
c复制代码char *strstr(const char *haystack, const char *needle);7.memcpy(): 从源地址复制指定数量的字节到目标地址。
c复制代码void *memcpy(void *dest, const void *src, size_t n);8.memset(): 将内存区域设置为给定的值。
c复制代码void *memset(void *s, int c, size_t n);9.memmove(): 从源地址复制字节到目标地址,可以处理重叠的内存区域。
c复制代码void *memmove(void *dest, const void *src, size_t n);10.bzero(): 将内存区域设置为零。
这是一个非标准的函数,但在一些旧的代码中可能会看到。
在新的代码中,建议使用memset。
Java基础第5章编程题答案
第五章编程题1.编写一个程序,实现字符串大小写的转换并倒序输出。
要求如下:(1)使用for循环将字符串“HelloWorld”从最后一个字符开始遍历。
(2)遍历的当前字符如果是大写字符,就使用toLowerCase()方法将其转换为小写字符,反之则使用toUpperCase()方法将其转换为大写字符。
(3)定义一个StringBuffer对象,调用append()方法依次添加遍历的字符,最后调用StringBuffer对象的toString()方法,并将得到的结果输出。
【参考答案】public class Chap5e {public static void main(String[] args) {String str="Hell5oWorld";char[] ch=str.toCharArray();StringBuffer s=new StringBuffer();for(int i=ch.length-1;i>=0;i--){if(ch[i]>='A'&&ch[i]<='Z')s.append(String.valueOf(ch[i]).toLowerCase());elseif(ch[i]>='a'&&ch[i]<='z')s.append(String.valueOf(ch[i]).toUpperCase());elses.append(String.valueOf(ch[i]));}System.out.print(s.toString());}}2. 利用Random类来产生5个20`30之间的随机整数并输出。
【参考答案】import java.util.Random;public class Chap5e {public static void main(String[] args) {Random r=new Random();for(int i=0;i<5;i++){System.out.println(r.nextInt(30-20+1)+20);}}}3. 编程. 已知字符串:”this is a test of java”.按要求执行以下操作:(1) 统计该字符串中字母s出现的次数(2) 取出子字符串”test”(3) 将本字符串复制到一个字符数组Char[] str中.(4) 将字符串中每个单词的第一个字母变成大写,输出到控制台。
蓝牙串口透传芯片CH9141手册
0、说明CH9141蓝牙串口透传芯片手册 版本:2A1、概述CH9141是一款蓝牙串口透传芯片,芯片支持广播模式、主机模式和从机模式,支持蓝牙BLE4.2。
支持串口AT 配置和在从机模式下的蓝牙通信配置,支持MODEM 联络信号,并提供通用GPIO 、同步GPIO 、ADC 采集功能,串口波特率最高1Mbps 。
蓝牙从机模式下可设置蓝牙名称、厂商信息等参数,可通过APP 或者串口命令轻松配置,方便快捷。
提供电脑端虚拟串口驱动可使蓝牙接口直接使用串口调试工具、兼容串口应用程序,无需二次开发即可与串口接口通讯,轻松让串口实现免插线和不受线缆距离限制。
下图为CH9141一些应用方案框图:图1蓝牙主机通过CH9141蓝牙与串口设备进行串口通讯框图图2两端MCU 或串口设备使用CH9141蓝牙主从连接进行通讯框图2、特点l 支持广播模式、主机模式和从机模式。
l 支持串口AT 配置和蓝牙传输配置。
l 提供电脑端蓝牙虚拟串口驱动。
l 兼容已有串口软件和工具,无需二次开发。
l 支持Windows/Linux/Android/iOS 等系统蓝牙主机连接。
l 提供通用GPIO 和同步GPIO 功能,支持蓝牙控制。
l 支持一路12位ADC 采集,支持蓝牙读取。
l 掉电睡眠电流0.3uA 。
l 传输距离100米 l 发射功率8档可调。
l 支持3.3V 和2.5V 工作电压。
l 异步串口最高通讯波特率1Mbps 。
l 串口支持MODEM 联络信号RTS 、DTR 、DCD 、RI 、DSR 、CTS 。
l串口支持5、6、7或者8 个数据位以及1或者2个停止位。
~BLE 蓝牙~ BLE 蓝牙l 串口支持奇、偶、无校验、空白0、标志1等校验方式。
l 支持获取芯片供电电压参数。
l 32K 时钟源可选外部晶振。
l 提供QFN28方形无引线28脚封装和ESSOP10封装。
3、封装型号 芯片封装名称 描述 CH9141 QFN28 4*4mm CH9141K ESSOP106*5mm4、引脚QFN28 引脚号 ESSOP10引脚号 引脚名称类型 引脚说明 0 0GND P 电源地1 无 X32K0 A 低频振荡器的反相输出端2 X32KI A 低频振荡器的反相输入端3 VDD_D P 电源,需外接2.2uF 退耦电容4 VSW P 内部DC-DC 开关输出5 2VCC P 芯片电源输入,需外接2.2uF 退耦电容6 10 AT I AT 透传功能切换引脚 0:AT 模式 1:透传模式7 无ADC A 模拟ADC 输入引脚8DCD# /GPIO7 I/O DCD#:UART 的MODEM 输入信号,载波检测。
24C04编程
实验16 EEPROM24C02默认分类2010-03-13 11:09:04 阅读20 评论0 字号:大中小订阅/////////////////////////////////////////////////////24C02存储芯片使用演示程序//精英团队提供//位选信号:由右到左为P20、P21、P22、P23、P24、P33//数据线:P0口//数码管数字码:0 0xC0 1 0xF9 2 0xA4 3 0xB0 4 0x99 5 0x92 6 0x82 7 0xF8 8 0x80 9 0x90//按键信号:K1 P10 K2 P11//24C02信号:SCL P34 SDA P35///////////////////////////////////////////////////#include<reg52.h>#define TRUE 1#define FALSE 0#define Delay_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/sbit K1=P1^0;sbit K2=P1^1;sbit SCL=P3^4;sbit SDA=P3^5;sbit wei1=P2^0;sbit wei2=P2^1;sbit wei3=P2^2;sbit wei4=P2^3;sbit wei5=P2^4;sbit wei6=P3^3;///////////////////////////////////////////////////void delay(unsigned long time){while(time--);}//////////////////////////////////////////////////void I2C_Start(void){/*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/SDA=1;SCL=1;delay(Delay_TIME);SDA=0;delay(Delay_TIME);SCL=0;delay(Delay_TIME);}void I2C_Stop(void){/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/SDA=0;SCL=1;delay(Delay_TIME);SDA=1;delay(Delay_TIME);SCL=0;delay(Delay_TIME);}void SEND_0(void) /* SEND ACK */{/*发送0,在SCL为高电平时使SDA信号为低*/SDA=0;SCL=1;delay(Delay_TIME);SCL=0;delay(Delay_TIME);}void SEND_1(void){/*发送1,在SCL为高电平时使SDA信号为高*/SDA=1;SCL=1;delay(Delay_TIME);SCL=0;delay(Delay_TIME);}bit Check_Acknowledge(void){/*发送完一个字节后检验设备的应答信号*/SDA=1;SCL=1;delay(Delay_TIME/2);F0=SDA;delay(Delay_TIME/2);SCL=0;delay(Delay_TIME);if(F0==1)return FALSE;return TRUE;}void WriteI2CByte(unsigned char b)reentrant{/*向I2C总线写一个字节*/unsigned char i;for(i=0;i<8;i++)if((b<<i)&0x80)SEND_1();elseSEND_0();}unsigned char ReadI2CByte(void)reentrant{/*从I2C总线读一个字节*/unsigned char b=0,i;for(i=0;i<8;i++){SDA=1; /*释放总线*/SCL=1; /*接受数据*/delay(10);F0=SDA;delay(10);SCL=0;if(F0==1){b=b<<1;b=b|0x01;}elseb=b<<1;}return b;}/**********以下为读写24c02的函数******************************/ void Write_One_Byte(unsigned char addr,unsigned char thedata){bit acktemp=1;/*write a byte to mem*/I2C_Start();WriteI2CByte(0xa0);acktemp=Check_Acknowledge();WriteI2CByte(addr); /*address*/acktemp=Check_Acknowledge();WriteI2CByte(thedata); /*thedata*/acktemp=Check_Acknowledge();I2C_Stop();}/************************************************************/char Read_One_Byte(unsigned char addr){bit acktemp=1;unsigned char mydata;/*read a byte from mem*/I2C_Start();WriteI2CByte(0xa0);acktemp=Check_Acknowledge();WriteI2CByte(addr);/*address*/acktemp=Check_Acknowledge();I2C_Start();WriteI2CByte(0xa1);acktemp=Check_Acknowledge();mydata=ReadI2CByte();acktemp=Check_Acknowledge();return mydata;I2C_Stop();}//调用方式举例://Write_One_Byte(0x10,0x04);//k=Read_One_Byte(0x10);/////////////////////////////////////////////////////////////void LEDdisplay(unsigned char numb,unsigned char wei)//显示子函数{switch(numb){case 0:P0=0xC0;break;case 1:P0=0xF9;break;case 2:P0=0xA4;break;case 3:P0=0xB0;break;case 4:P0=0x99;break;case 5:P0=0x92;break;case 6:P0=0x82;break;case 7:P0=0xF8;break;case 8:P0=0x80;break;case 9:P0=0x90;break;}switch(wei){case 1:wei1=1;wei2=0;wei3=0;wei4=0;wei5=0;wei6=0;break; case 2:wei1=0;wei2=1;wei3=0;wei4=0;wei5=0;wei6=0;break; case 3:wei1=0;wei2=0;wei3=1;wei4=0;wei5=0;wei6=0;break; case 4:wei1=0;wei2=0;wei3=0;wei4=1;wei5=0;wei6=0;break; case 5:wei1=0;wei2=0;wei3=0;wei4=0;wei5=1;wei6=0;break; case 6:wei1=0;wei2=0;wei3=0;wei4=0;wei5=0;wei6=1;break;}}//////////////////////////////////////////////////void main(void){char n=0;K1=1;K2=1;n=Read_One_Byte(0x00);//读取数值while(1){if(K1==0){delay(4000);n--;if(n<0)n=16;Write_One_Byte(0x00,n);//数值更改后存取}if(K2==0){n++;if(n>16)n=0;Write_One_Byte(0x00,n);//数值更改后存取}LEDdisplay(n%10,1);delay(50);LEDdisplay(n/10,2);delay(50);}}//////////////////////////////////////////////////。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
i=5
主串: 模式:
ababc abc a cbab
?
abc a c
j=3
第三趟 (初始 初始i=3) 初始
数据结构 – Data Structures
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
数据结构 – Data Structures
第四章 串
本章内容
4.1 串的定义及基本运算 4.2 串的表示和实现 4.3 串的模式匹配 4.3.1 基本的模式匹配算法 4.3.2 KMP模式匹配算法 4.4 串操作应用举例
数据结构 – Data Structures
4.1 串的定义及基本运算
串的定义 串(String)是零个或多个字符组成的有限序列。 一般记作:S=“a1a2a3…an”, 其中 S:串名 串名; 串名 “a1a2a3…an”:串值,双引号括起来的字符序列; 串值, 串值 ai(1≤i≤n)可以是字母、数字或其它字符; 串的长度: 串的长度:串中所包含的字符个数;
例如:设A和B分别为A=“This is a string” B=“is” 则B是A的子串,A为主串。B在A中出现了两次,其中首次 出现所对应的主串位置是3。因此,称B在A中的位置为3。
特别地,空串是任意串的子串,任意串是其自身的子串。 特别地,空串是任意串的子串,任意串是其自身的子串。
数据结构 – Data Structures
数据结构 – Data Structures
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法(基本的模式匹配算法) 例:主串S:ababcabcacbab 模式P:abcac
设i为指向S中字符的指针,j为指向模式串字符的指针 当Si=Pj时,i、j分别增1,指向下一字符,否则使i退回到 本趟匹配过程的起始位置,使j重新指向模式串的第一个字 符,然后令i增1后并重新开始新一趟的匹配过程。
?
abc a c
j=5
不同
第三趟 (初始 初始i=3) 初始
数据结构 – Data Structures
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
i=4
主串: 模式:
ababc abc a cbab
?
abc a c
不同
j=1
第四趟 (初始 初始i=4) 初始
数据结构 – Data Structures
4.2 串的表示和实现
串的堆分配存储 基本操作的实现 (3)求子串
Status substr(Hstring &sub,Hstring s,int pos,int len){ if (pos<1 || pos>s.length || len<0 || len>s.length-pos+1) return error; if (sub.ch) free(sub.ch); if (!len) { sub.ch = null; sub.length = 0; }
数据结构 – Data Structures
4.2 串的表示和实现
串的定长顺序存储 使用数组存储串 #define maxstrlen 256 typedef char sstring[maxstrlen]; sstring s; //s可容纳255个字符
串作为高级语言支持的数据类型,对于 串长度(或串的结尾表示),会有不同的 方式,对于超过串存储空间的部分会截 截 断存储。
数据结构 – Data Structures
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
i=1
主串: 模式:
ababc abc a cbab
?
abc a c
j=1
第一趟 (初始 初始i=1) 初始
数据结构 – Data Structures
数据结构 – Data Structures
4.2 串的表示和实现
串的堆分配存储
基本操作的实现 (1)串赋值
Status strassign(Hstring &T,char *chars){ //生成一个其值等于串常量chars的串T if(T.ch) free(T.ch); for(i = 0,c = chars;c; ++i,++c); //求chars长度 if(!i) { T.ch = null; T.length = 0; } else{ if (!(T.ch = (char *)malloc(i*sizeof(char)))) exit(OVERFLOW); T.ch[0..i-1] = chars[0..i-1]; T.length = i; } return OK; }
数据结构 – Data Structures
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
?
abc a c
j=1
不同 第二趟 (初始 初始i=2) 初始
数据结构 – Data Structures
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
i=3
主串: 模式:
ababc abc a cbab
?
abc a c
j=1
第三趟 (初始 初始i=3) 初始
4.2 串的表示和实现
串的链式存储 S A B C
…
M ^
结点大小为1的单链表
存储密度: 存储密度: 串值所占的存储空间 实际分配的存储空间 S A B C D E F G H
…
M# # # ^
结点大小为4的单链表
数据结构 – Data Structures
4.3 串的模式匹配
子串定位运算又称为模式匹配(Pattern Matching)或串匹 配(String Matching)。 在串匹配中,一般将主串称为目标串,子串称为模式串。 若子串在主串中出现,则称匹配成功,子串出现的位置 称为有效位移,否则称匹配不成功。 模式匹配在文章的关键字查找中被广泛使用。
数据结构 – Data Structures
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
i=4
主串: 模式:
ababc abc a cbab
?
abc a c
j=2
第三趟 (初始 初始i=3) 初始
数据结构 – Data Structures
S1.Length
S2
S2.Length
① S1.Length+S2.Length<= MaxStrlen
T ② S1.Length<MaxStrlen 并且S1.Length+S2.Length>MaxStrlen T
S2中被截去的部分
③ S1.Length = MaxStrlen T
S2串被全部截去
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
i=2
主串: 模式:
ababc abc a cbab
?
abc a c
j=2
第一趟 (初始 初始i=1) 初始
数据结构 – Data Structures
4.3 串的模式匹配
模式匹配算法 朴素的串匹配算法 例:主串S:ababcabcacbab 模式P:abcac
长度为零的串称为空串 空串(Empty String),它不包含任何字符。 空串
空白串: 空白串:通常将仅由一个或多个空格组成的串称为空白串 (Blank String)。 注意:空串和空白串的不同。
数据结构 – Data Structures
4.1 串的定义及基本运算
串的子串: 串的子串:串中任意个连续字符组成的子序列称为该串的 子串(SubString),包含子串的串相应地称为主串 主串。通常将子 子串 主串 串在主串中首次出现时的该子串的首字符对应的主串中的 序号,定义为子串在主串中的序号 子串在主串中的序号(或位置 位置)。 子串在主串中的序号 位置
else{ sub.ch = (char *)malloc(len*sizeof(char)); sub.ch[0..len - 1] = s[pos-1..pos + len-2]; s.length = len; } }
请自学有关堆分配串的其他操作的实现! 请自学有关堆分配串的其他操作的实现
数据结构 – Data Structures
4.1 串的定义及基本运算
串的基本运算 串赋值: StrAssign(&S, char *t) 串比较: int StrCompare(S, T) 求串长: int StrLength(S) 串联接: char *strcat(char *to, char *from) 求子串: SubString(&sub, S, pos, len) 串复制 : char *strcpy(char *to,char *from) 子串定位: int index(Sub,S)
数据结构 – Data Structures
4.2 串的表示和实现
串的堆分配存储
基本操作的实现 (2)串联接
Status concat(Hstring &t, Hstring s1, Hstring s2){