的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用C语言本身提供的串函数)。 (三) 测试数据 1. 用StrAssign生成S1=’THIS IS A BOOK’,S2=’S’,S3=’ESE ARE’ 用SubString(S,S1,3,7)求出S=’IS IS A’ 用ConCat(T,S1,S2)求出T=’THIS IS A BOOKS’
时间: 2023-10-30 08:04:48 浏览: 98
好的,根据您的要求,我会给出C语言的代码实现,不使用C语言本身提供的串函数。
首先,我们需要定义一个结构体来表示字符串:
```c
#define MAX_LEN 100 // 定义最大字符串长度为100
typedef struct {
char ch[MAX_LEN]; // 字符数组存储字符串
int length; // 当前字符串长度
} HString;
```
接下来,我们依次实现StrAssign、SubString、ConCat和Replace这四个操作。
1. StrAssign
StrAssign函数用于将一个字符串赋值给一个HString类型的变量。具体实现如下:
```c
void StrAssign(HString *s, char *str) {
int len = strlen(str);
s->length = len;
for (int i = 0; i < len; i++) {
s->ch[i] = str[i];
}
}
```
其中,参数s是指向HString类型变量的指针,参数str是一个普通的字符串。在函数中,我们首先获取str的长度,并将其赋值给s的length成员变量。然后使用循环将str中的字符逐个复制到s的ch数组中。
接下来,我们使用StrAssign函数生成S1、S2和S3:
```c
HString S1, S2, S3;
StrAssign(&S1, "THIS IS A BOOK");
StrAssign(&S2, "S");
StrAssign(&S3, "ESE ARE");
```
2. SubString
SubString函数用于截取HString类型变量中的一部分。具体实现如下:
```c
void SubString(HString *sub, HString s, int pos, int len) {
if (pos < 1 || pos > s.length || len < 0 || pos + len - 1 > s.length) {
printf("Error: invalid substring.\n");
exit(1);
}
sub->length = len;
for (int i = 0; i < len; i++) {
sub->ch[i] = s.ch[pos + i - 1];
}
}
```
其中,参数sub是指向HString类型变量的指针,参数s是一个HString类型变量,表示要截取的字符串,pos表示截取的起始位置,len表示截取的长度。在函数中,我们首先对pos和len进行合法性检查,如果不合法则输出错误信息并退出程序。然后将sub的length成员变量赋值为len,使用循环将s中的字符逐个复制到sub的ch数组中。
接下来,我们使用SubString函数求出S:
```c
HString S;
SubString(&S, S1, 3, 7);
```
3. ConCat
ConCat函数用于将两个HString类型变量连接起来。具体实现如下:
```c
void ConCat(HString *t, HString s1, HString s2) {
int len1 = s1.length;
int len2 = s2.length;
if (len1 + len2 > MAX_LEN) {
printf("Error: string too long.\n");
exit(1);
}
for (int i = 0; i < len1; i++) {
t->ch[i] = s1.ch[i];
}
for (int i = 0; i < len2; i++) {
t->ch[len1 + i] = s2.ch[i];
}
t->length = len1 + len2;
}
```
其中,参数t是指向HString类型变量的指针,参数s1和s2是两个HString类型变量,表示要连接的字符串。在函数中,我们首先获取s1和s2的长度,并对它们进行合法性检查。如果它们的长度之和超过了最大长度MAX_LEN,则输出错误信息并退出程序。然后使用循环将s1和s2中的字符逐个复制到t的ch数组中,并设置t的length成员变量为s1和s2的长度之和。
接下来,我们使用ConCat函数求出T:
```c
HString T;
ConCat(&T, S1, S2);
```
4. Replace
Replace函数用于将HString类型变量中的子串替换为另一个HString类型变量。具体实现如下:
```c
void Replace(HString *s, HString t, HString v) {
int pos = Index(*s, t, 1);
while (pos != -1) {
for (int i = pos; i < pos + t.length; i++) {
s->ch[i - 1] = ' ';
}
for (int i = s->length + v.length - t.length; i >= pos + v.length; i--) {
s->ch[i - 1] = s->ch[i - v.length - 1];
}
for (int i = 0; i < v.length; i++) {
s->ch[pos + i - 1] = v.ch[i];
}
s->length = s->length + v.length - t.length;
pos = Index(*s, t, pos + v.length);
}
}
```
其中,参数s是指向HString类型变量的指针,表示要进行替换的字符串,参数t和v是两个HString类型变量,表示要被替换的子串和替换成的字符串。在函数中,我们首先使用Index函数查找s中第一个匹配t的位置。如果找到了,则使用三个循环分别将原来的子串替换成新的字符串。具体来说,第一个循环将原来的子串替换成空格,第二个循环将原来的后面的字符向后移动v.length-t.length个位置,第三个循环将新的字符串复制到s的相应位置。然后更新s的length成员变量,并继续使用Index函数查找下一个匹配t的位置。如果没有找到,则结束函数。
接下来,我们使用Replace函数求出T:
```c
Replace(&T, S, S3);
```
到此为止,我们完成了所有的操作。完整代码如下:
阅读全文