下列程序的结果是?StrAssign(s,’this is a book’); Replace(s,SubString(s,3,7),’ese are’); 并给出解析
时间: 2024-05-18 11:15:56 浏览: 84
这段程序的结果是:'th ese are a book'。
解析:
- 首先,使用 StrAssign 函数将字符串 s 赋值为 'this is a book'。
- 然后,使用 SubString 函数截取字符串 s 中从第 3 个字符开始的 7 个字符,即 'is is a'。
- 最后,使用 Replace 函数将字符串 s 中的 'is is a' 替换为 'ese are',得到最终结果 'th ese are a book'。
相关问题
用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’ 用Replace(T,S,S3)求出T=’THESE ARE BOOKS’(选做) 2. 用StrAssign生成U=’XYXYXYXYXYXY’,W=’w’ 用SubString(V,U,6,3)求出V=’YXY’ 用Replace(U,V,W)求出U=’XWXWXW’编写程序
好的,下面是一个用C语言实现的程序,可以完成这两个问题的要求:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef struct {
char *ch;
int length;
} HString;
int StrAssign(HString *t, char *chars) {
/*生成一个其值等于串常量chars的串T*/
int i, j;
char *c;
if (t->ch) free(t->ch);/*释放T原有空间*/
for (i = 0, c = chars; c[i] != '\0'; i++);/*求chars的长度*/
if (!i) {
t->ch = NULL;
t->length = 0;
} else {
t->ch = (char *) malloc(i * sizeof(char));
if (!(t->ch))
exit(OVERFLOW);
for (j = 0; j < i; j++)
t->ch[j] = chars[j];
t->length = i;
}
return OK;
}
int SubString(HString *t, HString s, int pos, int len) {
/*用t返回串s的第pos个字符起长度为len的子串*/
int i;
if (pos < 1 || pos > s.length || len < 0 || pos + len - 1 > s.length)
return ERROR;
if (t->ch) free(t->ch);/*释放t原有空间*/
if (!len) {
t->ch = NULL;
t->length = 0;
} else {
t->ch = (char *) malloc(len * sizeof(char));
if (!(t->ch))
exit(OVERFLOW);
for (i = 0; i < len; i++)
t->ch[i] = s.ch[pos - 1 + i];
t->length = len;
}
return OK;
}
int ConCat(HString *t, HString s1, HString s2) {
/*用t返回由s1和s2联接而成的新串*/
int i;
if (t->ch) free(t->ch);/*释放t原有空间*/
t->ch = (char *) malloc((s1.length + s2.length) * sizeof(char));
if (!(t->ch))
exit(OVERFLOW);
for (i = 0; i < s1.length; i++)
t->ch[i] = s1.ch[i];
for (i = 0; i
的最小操作子集的基础上,实现串抽象数据类型的其余基本操作(不使用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’
好的,根据您的要求,我会给出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);
```
到此为止,我们完成了所有的操作。完整代码如下:
阅读全文