试编写C程序,建立相应字符串存储结构,从键盘接受字符输入建立块连串存储结构,并完成在指定位置插入某个子串,在指定位置删除指定长度子串的操作,并打印输出相应操作的结果。
时间: 2024-10-23 14:14:22 浏览: 28
在C语言中,我们可以创建一个动态字符串(例如用`char*`指针和数组)来实现这个功能。首先,我们需要定义一个简单的字符串结构体,包含指向字符数组的指针以及字符串长度。这里是一个简单的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义字符串结构体
typedef struct {
char* str;
int len; // 字符串长度不包括结束符'\0'
} MyString;
// 动态分配内存并初始化字符串
MyString* create_string() {
MyString* s = (MyString*)malloc(sizeof(MyString));
s->str = malloc(1); // 初始容量为1
s->len = 0;
return s;
}
// 从键盘读取输入并追加到字符串
void input_and_append(MyString* s) {
while (true) {
char ch = getchar();
if (ch == '\n') break; // 输入换行就停止
s->str = realloc(s->str, s->len + 2); // 增加空间
*(s->str + s->len) = ch;
s->len++;
*(s->str + s->len) = '\0'; // 结束符
}
}
// 在指定位置插入子串
void insert_string(MyString* s, const char* sub_str, int pos) {
size_t sub_len = strlen(sub_str);
if (pos <= s->len) {
s->str = realloc(s->str, s->len + sub_len + 1);
memmove(&s->str[pos + sub_len], &s->str[pos], s->len - pos + 1);
memcpy(&s->str[pos], sub_str, sub_len);
s->len += sub_len;
} else {
printf("插入位置超出范围!\n");
}
}
// 删除指定长度的子串
void delete_substring(MyString* s, int start_pos, int length) {
if (start_pos >= 0 && start_pos < s->len && start_pos + length <= s->len) {
memmove(&s->str[start_pos], &s->str[start_pos + length], s->len - start_pos - length);
s->len -= length;
} else {
printf("删除操作无效!\n");
}
}
// 打印字符串
void print_string(const MyString* s) {
printf("%s\n", s->str);
}
int main() {
MyString* myStr = create_string();
input_and_append(myStr);
int op, pos;
printf("请选择操作:\n1. 插入子串\n2. 删除子串\n3. 打印字符串\n4. 退出\n");
scanf("%d", &op);
while (op != 4) {
switch (op) {
case 1: {
char sub_str[50];
printf("请输入要插入的子串: ");
fgets(sub_str, sizeof(sub_str), stdin);
sub_str[strlen(sub_str) - 1] = '\0'; // 去除换行符
scanf("%d", &pos);
insert_string(myStr, sub_str, pos);
break;
}
case 2: {
scanf("%d %d", &pos, &length);
delete_substring(myStr, pos, length);
break;
}
default:
print_string(myStr);
break;
}
printf("\n选择新的操作: ");
scanf("%d", &op);
}
free(myStr->str);
free(myStr);
return 0;
}
```
阅读全文