当前位置:文档之家› 串的基本操作

串的基本操作

串的基本操作
串的基本操作

1上机实训3:串的基本操作

一、实训目的

通过实训,掌握串的运算(赋值,比较,联结,插入子串,模式匹配……等)

二、实验理论知识

1)串的基本概念及其含义

串( string)是由零个或多个字符组成的有限序列,一般记作:

s='a1a2…an'(n≥0),其中s为串的名字,用单引号括起来的字符序列为串的值;ai(1≤i≤n)可以是字母、数字或其它字符(取决于程序设计语言所使用的字符集);n为串中字符的个数,称为串的长度。

2)串的存储表示及其实现

●顺序存储

可以用一组地址连续的存储单元依次存放串的各个字符,这是串的顺序

存储结构,也称为顺序串

●链式存储

和线性表的链式存储结构相类似,也可采用链表方式存储串值。串的这

种链式存储结构简称为链串。用链表存储字符串,每个结点需要有两个

域:一个数据域(data)和一个指针域(Next),其中数据域存放串中的字

符,指针域存放后继结点的地址。

3)模式匹配问题

三、实训案例与分析

【实例1】串的存储与基本运算

【实例分析】在本实例中练习计算字符串的长度、字符串的复制、字符串的比较、字符串的连接、字符串的插入等基本操作。在设计时

1)编写一个菜单函数,根据不同情况做(1-5)不同选择。

2)如果选择1,即要求计算输入字符串的长度。

3)如果选择2,完成字符串的复制。

4)如果选择3,完成字符串的比较。

5)如果选择4,完成两个字符串的连接。

6)如果选择5,字符串的插入。

【参考程序】

#include

#define MAX 128

typedef enum {fail,success} status;

typedef enum {false,true} boolean;

main()

{ int strlen();

void strass();

boolean strcmp();

status strcat( );

status strins();

int t,n,i;

boolean b;

status st;

char s[MAX],s1[MAX],s2[MAX];

printf("\n1. The length of string\n");

printf(" 2. The assignment of string\n");

printf(" 3. A string compare with another string:\n"); printf(" 4. A string connect with another string:\n"); printf(" 5. A string to be inserted into another string\n"); printf(" Please input a operation:");/*输入操作选项*/ scanf("%d",&t);

switch(t)

{

case 1:

printf("please input a string:\n");

getchar();

gets(s);

n=strlen(s);

printf("the length is: %d",n);

break;

case 2:

printf("please input the first string:\n");

getchar();

gets(s1);

printf("please input the second string:\n");

getchar();

gets(s2);

strass(s1,s2);

break;

case 3:

printf("please input the first string:\n"); getchar();

gets(s1);

printf("please input the second string: \n"); gets(s2);

b=strcmp(s1,s2);

if (b==true)

printf("equal\n");

else

printf("not equal\n");

break;

case 4:

printf("please input the first string:\n"); getchar();

gets(s1);

printf("please input the second string:\n"); gets(s2);

st=strcat(s1,s2);

if(st==success)

printf("answer is %s\n",s1);

else

printf("error!\n");

break;

case 5:

printf("please input the first string:\n"); getchar();

gets(s1);

printf("please input the second string:\n"); gets(s2);

printf("please input i:");

scanf("%d",&i);

st=strins(s1,i,s2);

if(st==success)

printf("answer is: %s\n",s1);

else printf("error!\n");

break;

case 0:break;

default: printf("There isn't this operation!");

}

}

int strlen(s) /*求字符串的长度子函数*/

char s[];

{ int i;

for(i=0;s[i]!='\0';i++);

return (i);

}

void strass(s1,s2)

char s1[],s2[];

{ int i=0;

while(s1[i]!='\0')

{ s2[i]=s1[i];

i++;

}

s2[i]='\0';

printf("s2 is %s",s2);

}

boolean strcmp(s1,s2) /*字符串比较子函数*/ char s1[],s2[];

{ int i=0;

while (s1[i]==s2[i] && s1[i]!='\0' && s2[i]!='\0') i++;

if (s1[i]=='\0' && s2[i]=='\0')

return (true);

else

return (false);

}

status strcat (s1,s2) /*字符串连接子函数*/

char s1[],s2[];

{ int i,j,k;

i=strlen(s1);

j=strlen(s2);

if((i+j)>=MAXN)

return(fail);

for(k=0;k<=j;k++)

s1[i+k]=s2[k];

return (success);

}

status strins (s1,i,s2)

char s1[],s2[];

int i;

{ int m,n,k;

m=strlen(s1);

n=strlen(s2);

if (i<0||i>m||(m+n)>MAXN )

return (fail) ;

for(k=m;k>=i;k--)

s1[k+n]=s1[k];

for(k=0;k

s1[i+k]=s2[k];

return (success);

}

【测试数据与结果:】

计算字符串的长度

1. The length of string

2. The assignment of string

3. A string compare with another string:

4. A string connect with another string:

5. A string to be inserted into another string Please input a opertation:1

please input a string:

you are a boy!

the length is: 14

字符串的复制

1. The length of string

2. The assignment of string

3. A string compare with another string:

4. A string connect with another string:

5. A string to be inserted into another string Please input a opertation:2

please input the first string:

you are a boy!

please input the second string:

i am a girl!

s2 is you are a boy!

字符串的比较

1. The length of string

2. The assignment of string

3. A string compare with another string:

4. A string connect with another string:

5. A string to be inserted into another string Please input a opertation:3

please input the first string:

you are a boy!

please input the second string:

i am a girl!

not equal

字符串的连接

1. The length of string

2. The assignment of string

3. A string compare with another string:

4. A string connect with another string:

5. A string to be inserted into another string

Please input a opertation:4

please input the first string:

you are a boy!

please input the second string:

i am a girl!

answer is:you are a boy!i am a girl!

字符串的插入

1. The length of string

2. The assignment of string

3. A string compare with another string:

4. A string connect with another string:

5. A string to be inserted into another string

Please input a opertation:5

please input the first string:

you are a boy!

please input the second string:

i am a girl!

please input i:2

answer is i am a girl! you are a boy!

【实例2】统计主串指定单词在主串中出现的次数和位置

【实例描述】统计主串指定单词在主串中出现的次数和位置,要求:

1)输入以回车作为结束符的一串字符作为主串;

2)求主串中指定单词出现的次数和位置,注意单词与子串的区别;

【实例分析】

假设num存放出现次数,初始化为0,position[i]存放每一次匹配时的位置。

1)编写一个菜单函数,根据不同情况做(0-3)不同选择

2)如果选择1,即要求匹配的是单个字符c,让i=0,依次比较主串的第i

个字符,如果s[i]==c,则匹配成功,position[num]=i;num++;

3)如果选择2,即要求匹配的是子串t,则此算法即为模式匹配算法,与模

式匹配不同的是每次匹配成功时不是返回,而是设置position和num的

值,position[num]=i-j;num++;

4)如果选择3,即要求匹配的是单词t,假设主串中单词之间用空格分割,

此算法与3)的不同,与t匹配的子串必须是一个单词,因此首先要找出

主串中的单词,然后让t与找到的单词比较,若结果相等,则匹配成功,设置position和num的值,position[num]=i-j; num++;否则,查找主串中

的下一个单词,直到主串结束。

【实例实现】

#include "string.h"

#include "stdio.h"

char str[60];

void menu() /*菜单选择函数*/

{char choice,c;

char t[20];

printf(" 指定类型\n");

printf("====================\n");

printf("1.单个字符\n");

printf("2.指定子串\n");

printf("3.指定单词\n");

printf("0.退出\n");

printf("====================\n");

do

{

printf("请你在上述功能中选择(0-3) : ");

choice=getchar();

getchar();

switch(choice)

{case '1':printf("input char : "); /*指定单个字符匹配的情况*/

c=getchar();getchar();

index_char(str,c);

break;

case '2':printf("input string : "); /*指定子串匹配的情况*/

gets(t);

index_string(str,t);break;

case '3':printf("input word : "); /*指定单词匹配的情况*/

gets(t);

index_word(str,t);break;

case '0':return;

}

}while(1);

}

index_string(char *s,char *t) /*子串匹配函数*/

{int i,j,num=0,position[80];

/*num存放匹配个数,position中存放每一次匹配的位置*/

i=0;j=0;

while(s[i]!='\0') /*主串没有结束*/

{while(s[i]!='\0'&&t[j]!='\0') /*没有遇到结束符*/

if(s[i]==t[j]) /*继续*/

{i++;

j++;}

else /*回溯*/

{i=i-j+1;

j=0;

}

if(t[j]=='\0')

{position[num]=i-j;num++;j=0;} /*匹配成功,存放位置,并且次数加1*/ }

if(num) /*如果匹配成功,输出匹配次数和位置*/

{printf("\nthe number of string \"%s\" is %d",t,num);

printf("\nthe position is:");

for(i=0;i

printf("%5d",position[i]);

printf("\n");}

else

printf("\n the string is not found!",i);

}

index_word(char *s,char *t)

{int i,j,num=0,position[80];

char word[20];

i=j=0;

while(s[i]!='\0')

{j=0;

while(s[i]==' ')

i++;

while((s[i]!=' ')&&(s[i]!='\0')) /*寻找主串中的单词*/

word[j++]=str[i++];

word[j]='\0';

if(strcmp(t,word)==0) /*如果输入的单词与主串中的单词匹配*/ {position[num]=i-j;num++;}

}

if(num) /*如果匹配成功,输出匹配次数和位置*/

{

printf("\nthe number of word \"%s\" is %d",t,num);

printf("\nthe position is:");

for(i=0;i

printf("%5d",position[i]);

printf("\n");

}

else

printf("\n the word is not found!");

}

index_char(char *s,char t)

{

int i=0,num=0,position[80];

while(s[i]!='\0')

{if(s[i]==t) {position[num]=i;num++;}

i++;}

if(num)

{

printf("\nthe number of char ' %c' is %d",t,num);

printf("\nthe position is:");

for(i=0;i

printf("%5d",position[i]);

printf("\n");

}

else

printf("\n the char is not found!");

相关主题
文本预览
相关文档 最新文档