字符串的基本操作实验

字符串的基本操作实验

一、实验目的

1、 掌握字符串的基本操作

2、 掌握字符串函数的基本使用方法

3、 熟悉串的模式匹配算法和一般的文字处理方法

二、实验内容
(一)验证实验

1、串的模式匹配:设有一目标串s和一模式串s1,判断目标串s中是否包含模式串s1。

方法是:从目标串s中的第一个字符开始,按s1模式串的长度s1.len,与s1子串中的字符依次对应比较。若不匹配,则再从目标串s中的第二个字符开始,仍按s1模式串的长度s1.len,与s1子串中的字符依次对应比较。如此反复进行比较。直到匹配成功或者目标串s中剩余的字符少于s1的长度为止。若匹配成功,则返回s1在s中的位置。若匹配不成功,则返回函数值-1。

2、串连接:将两个字符串连接。其中一个串接在另一个串的末尾,生成一个新串。(注意:串的末尾有\0)若给出两个串s1和s2,把s2连接在s1之后,生成一个新串s。

3、两串相等判断:给定两个串s1和s2,当s1和s2相等时,返回函数值1,否则返回函数值0。

实验程序:

1、

#define MAXLEN 25

typedef struct

{char ch[MAXLEN];

 int len;

}string;

int index(string s,string t,int pos){

int i,j;

i=pos;j=0;

while(i<s.len&&j<t.len){

  if (s.ch[i]==t.ch[j]){++i;++j;}

  else {i=i-j+1;j=0;}

}

if(j>t.len-1) return (i-t.len);

else return-1;

}

 

main()

{string a={"Beijing Shanghai China",22},a1={"Shanghai",8};

int r;

r=index(a,a1,0);

printf("\n%d",r);

}

2、

#define MAXLEN 14

typedef struct

{char ch[MAXLEN];

 int len;

}string;

string connect(string s1,string s2){

string s;

int i;

if(s1.len+s2.len<=MAXLEN)

 {

 for(i=0;i<s1.len;i++)

  s.ch[i]=s1.ch[i];

 for(i=0;i<s2.len;i++)

  s.ch[s1.len-1+i]=s2.ch[i];

  s.len=s1.len+s2.len-1;}

else

  s.len=0;

return(s);

}

main()

{string a1={"Beijing",8},a2={"Ching",6};

string a;

a=connect(a1,a2);

printf("\n%s\n%d",a.ch,a.len);}

3、

#define MAXLEN 13

typedef struct

{char ch[MAXLEN];

 int len;

}string;

int equal(string s1,string s2){

int i;

if(s1.len!=s2.len)

return (0);

else

{for(i=0;i<s1.len;i++)

if(s1.ch[i]!=s2.ch[i])

return(0);

}

return(1);

}

main()

{string a1={"Beijing",8},a2={"ching",5};

int r;

r=equal(a1,a2);

printf("\n%d",r);

}
(二)设计实验
1、根据串的基本操作完成串查找和替换操作
实验程序:
\#include <stdio.h>

\#define MAXSTRLEN 255

typedef unsigned char SString[MAXSTRLEN+1];

int strLength(SString S)     //求串的长度

{int m;

for(m=0;S[m]!='\0';m++);

return m;

}

void StringCopy(SString T,SString S)

{

int i;

for(i=1;i<=strLength(S);i++)

T[i]=S[i];

T[i]='\0';

}

void Replace(SString s, SString s1, SString s2) 

{ SString  t;

int i,j,f,k=0;

if(strLength(s)>= strLength(s1))

{for(i=0;i<= strLength(s);)

{if(i<= strLength(s)- strLength(s1))

{f=1;   //查找

for(j=0;j< strLength(s1);j++)

if(s[i+j]!=s1[j])

{f=0;

break;}

}

else f=0;

if (f==1)

{

for(j=0;j<strLength(s2);j++,k++)  //替换

t[k]=s2[j];

i=i+ strLength(s1);

}

else

{t[k]=s[i];   //复制一个字符

k++;

i++;}}}

StringCopy(s,t);   //复制字符串

 }

void main()

{SString str;

SString  temp,substr;

printf("请输入主串:");

scanf("%s",str);

printf("请输入查找的字符串");

scanf("%s",temp);

printf("请输入替换的字符串");

scanf("%s",substr);

Replace(str,temp,substr);

printf("新字符串为");

printf("%s\n",str);

}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于定长顺序存储结构实现对串的赋值、串比较、求子串的位置、串替换等操作。要求所有操作均以函数的形式实现,在主函数中调用各个函数实现整体功能。 注意:每一个字符串的第一个元素存放的是该字符串的长度(不包括第一个元素),除串的赋值外,其他所有操作(比较、求子串的位置、串替换)等都不应包含该字符。 1.1.实验1:串赋值函数实现: 按照系统已经定义的函数接口编写函数实体,实现:将输入数组StrInput[]的数据赋值给待赋值数组StrTobeAssigned[],其中待赋值数组StrTobeAssigned[0]存放有效数据的长度,StrTobeAssigned[1]之后存放带赋值数据。 具体要求和相关假设为: ① 函数接口定义为:int MyStrAssign(char * StrTobeAssigned, char * StrInput); ② 输入参数:待赋值字符串变量StrTobeAssigned,字符串的期望值StrInput; ③ 输出参数:无; ④ 处理规则及返回值:将StrTobeAssigned[1]及之后的内容赋值为StrInput的有效内容,StrTobeAssigned[0]赋值为StrInput有效字符的长度,并返回1; ⑤ 假设: a)两个字符串均不为空串; b)StrInput存放的是一个完成的字符串(不包含长度); c)赞不考虑输入数据超过数组总长度的情况。 1.2实验2:串替换函数: 按照系统已经定义的函数接口编写函数实体,实现:在主串中MainStr查找是否存在某特定子串SubStr1,若存在则将所有的SubStr1替换为新的指定子串SubStr2,函数返回字符串替换的次数。 具体要求和相关假设为: ① 函数接口定义为:int MyStrReplace(char * MainStr, char * SubStr1, char * SubStr2); ② 输入参数:主串变量MainStr,子串变量SubStr1,SubStr2; ③ 输出参数:无; ④ 处理规则及返回值:若主串中存在子串,用SubStr2替换主串MainStr中出现的所有与SubStr1相同的不重叠的子串,并返回字符串替换的次数;否则返回0。 ⑤ 假设: a)主串和两个子串均不为空串; b)MainStr[0]和SubStr1[0],SubStr2[0]分别存放对应字符串的长度,不用替换该部分。 2.问题分析 (1)根据实验一的内容可知,我们需要通过编写函数实体的形式实现串的赋值操作,主要的思路包括: (a)获得输入字符串的长度len; (b)将输入字符串的长度len赋值给待赋值字符串的第一个元素StrTobeAssigned[0]; (c)依次将输入字符串的数据赋值给待赋值字符串。 (2)根据实验二的内容可知,我们需要通过编写函数实体的形式实现串的替换操作,主要的思路包括: (a)遍历主串MainStr,检查是否存在某特定子串SubStr1; (b)如果存在则找到子串在主串中的位置; (c)在主串中删除该子串并更新主串长度; (d)在主串中插入该子串并更新主串长度; (e)过程中记录替换字符串的次数,遍历结束后返回该次数(如果没有替换则为0); 如果有必要,可以使用本实验已经提供的相关函数,如:求子串位置的函数MySubStrIndex(),子串删除函数MyStrDelete()和子串插入函数MyStrInsert()等
实验名称:字符串操作实验 实验目的:通过实现字符串的常见操作,掌握字符串的基本概念和操作方式。 实验环境:C++语言,Visual Studio 2019 实验步骤: 1. 字符串定义和初始化 在C++中,字符串可以用字符数组或string类型来表示。字符数组定义方式如下: ``` char str[20]; //定义一个长度为20的字符数组 ``` string类型定义方式如下: ``` string s; //定义一个空字符串 ``` 字符串初始化可以直接在定义时赋值,也可以通过赋值语句进行赋值。例如: ``` char str1[] = "hello world"; //定义并初始化字符数组 string s1 = "hello world"; //定义并初始化string类型 char str2[20]; strcpy(str2, "hello world"); //使用strcpy函数进行字符串复制 ``` 2. 字符串输入输出 可以使用cin和cout语句进行字符串的输入和输出。对于字符数组,需要使用gets和puts函数进行输入输出。例如: ``` char str[20]; cout << "请输入字符串:"; gets(str); //使用gets函数进行字符串输入 cout << "你输入的字符串是:" << str << endl; //使用puts函数进行字符串输出 ``` 对于string类型的字符串,可以直接使用cin和cout语句进行输入输出。例如: ``` string s; cout << "请输入字符串:"; cin >> s; //使用cin语句进行字符串输入 cout << "你输入的字符串是:" << s << endl; //使用cout语句进行字符串输出 ``` 3. 字符串长度 可以使用strlen函数获取字符数组的长度,也可以使用string类型的size函数获取字符串的长度。例如: ``` char str[] = "hello world"; int len1 = strlen(str); //获取字符数组的长度 string s = "hello world"; int len2 = s.size(); //获取字符串的长度 ``` 4. 字符串连接 可以使用strcat函数将两个字符数组连接起来,也可以使用+运算符将两个string类型的字符串连接起来。例如: ``` char str1[] = "hello"; char str2[] = "world"; char str3[20] = ""; strcat(str3, str1); //将str1复制到str3中 strcat(str3, str2); //将str2连接到str3中 cout << str3 << endl; //输出str3 string s1 = "hello"; string s2 = "world"; string s3 = s1 + s2; //将s1和s2连接到一起 cout << s3 << endl; //输出s3 ``` 5. 字符串比较 可以使用strcmp函数比较两个字符数组是否相等,也可以使用==运算符比较两个string类型的字符串是否相等。例如: ``` char str1[] = "hello"; char str2[] = "world"; if (strcmp(str1, str2) == 0) { cout << "str1和str2相等" << endl; } else { cout << "str1和str2不相等" << endl; } string s1 = "hello"; string s2 = "world"; if (s1 == s2) { cout << "s1和s2相等" << endl; } else { cout << "s1和s2不相等" << endl; } ``` 实验结果: 根据以上步骤,我们可以实现字符串的常见操作,包括定义和初始化、输入输出、长度获取、连接和比较等。通过实验,我掌握了字符串的基本概念和操作方式,提升了自己的编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木头科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值