user-0 提问: 串的插入（s为原串，pos为插入的位置，t为待插入串）

回复:
user: user-1
content: 因为还有个字符串结束符，所以用内存拷贝是字符串的长度+1 同样的，如果HeapString是这么单纯的一个结构体，那StrInsert函数里的 temp=(char*)malloc(s->len+t->len+1); //这里申请内存也要多+1，因为还有个字符串结束符

user: user-2
content: 引用 10 楼 肥牛肉^*^ 的回复:[quote=引用 9 楼 自信男孩的回复:]#include<stdio.h> #include<string.h> #include<stdlib.h>  typedef struct{     char* ch;     int len; }HeapString;  int StrInsert(HeapString* s,int pos,HeapString t);  int StrInsert(HeapString* s,int pos,HeapString t) {     int i;     char* temp;     if(pos<1||pos>s->len+1||s->len==0)         return 0;     temp=(char*)malloc(s->len+t.len);     if(temp==NULL)         return 0;     printf("%s\n", t.ch);     for(i=0;i<pos;i++)         temp[i]=s->ch[i];     //for(i=1;i<t.len;i++)     for(i=0;i<t.len;i++)         temp[i+pos]=t.ch[i];     for(i=pos;i<s->len;i++)         temp[i+t.len]=s->ch[i];     s->len+=t.len;     puts(temp);     free(s->ch);     s->ch=temp;     return 1; } int main() {     HeapString s;     HeapString t;     char sub_src[16] = "00";     //s.ch = "12345";     s.ch = (char *)malloc(sizeof(char) * 16);     if (!s.ch)         return -1;     memset(s.ch, 0, 16);     memcpy(s.ch, "12345", 6);     //t.ch = "00";     t.ch = sub_src;     s.len = 5;     t.len = 2;     if(StrInsert(&s,3,t))         printf("%s\n",s.ch);     return 0; } 供参考～  楼主的用例是指向了只读数据段的位置，所以不能进行读写  如果看到函数里有free，就要考虑在调用子函数之前是用malloc的，另外函数里也有问题，循环应该从0开始。 mencpy（）里面为什么是6，不是把字符串12345赋值给s.ch？[/quote] 还有一个'\0'，这个字符需要注意，如果楼主坚持按照main函数的 printf("%s\n",s.ch); 这样输出，就需要填充'\0'到有效字符的最后

user: user-0
content: 引用 9 楼 自信男孩的回复:#include<stdio.h> #include<string.h> #include<stdlib.h>  typedef struct{     char* ch;     int len; }HeapString;  int StrInsert(HeapString* s,int pos,HeapString t);  int StrInsert(HeapString* s,int pos,HeapString t) {     int i;     char* temp;     if(pos<1||pos>s->len+1||s->len==0)         return 0;     temp=(char*)malloc(s->len+t.len);     if(temp==NULL)         return 0;     printf("%s\n", t.ch);     for(i=0;i<pos;i++)         temp[i]=s->ch[i];     //for(i=1;i<t.len;i++)     for(i=0;i<t.len;i++)         temp[i+pos]=t.ch[i];     for(i=pos;i<s->len;i++)         temp[i+t.len]=s->ch[i];     s->len+=t.len;     puts(temp);     free(s->ch);     s->ch=temp;     return 1; } int main() {     HeapString s;     HeapString t;     char sub_src[16] = "00";     //s.ch = "12345";     s.ch = (char *)malloc(sizeof(char) * 16);     if (!s.ch)         return -1;     memset(s.ch, 0, 16);     memcpy(s.ch, "12345", 6);     //t.ch = "00";     t.ch = sub_src;     s.len = 5;     t.len = 2;     if(StrInsert(&s,3,t))         printf("%s\n",s.ch);     return 0; } 供参考～  楼主的用例是指向了只读数据段的位置，所以不能进行读写  如果看到函数里有free，就要考虑在调用子函数之前是用malloc的，另外函数里也有问题，循环应该从0开始。 mencpy（）里面为什么是6，不是把字符串12345赋值给s.ch？

user: user-2
content: #include<stdio.h> #include<string.h> #include<stdlib.h>  typedef struct{     char* ch;     int len; }HeapString;  int StrInsert(HeapString* s,int pos,HeapString t);  int StrInsert(HeapString* s,int pos,HeapString t) {     int i;     char* temp;     if(pos<1||pos>s->len+1||s->len==0)         return 0;     temp=(char*)malloc(s->len+t.len);     if(temp==NULL)         return 0;     printf("%s\n", t.ch);     for(i=0;i<pos;i++)         temp[i]=s->ch[i];     //for(i=1;i<t.len;i++)     for(i=0;i<t.len;i++)         temp[i+pos]=t.ch[i];     for(i=pos;i<s->len;i++)         temp[i+t.len]=s->ch[i];     s->len+=t.len;     puts(temp);     free(s->ch);     s->ch=temp;     return 1; } int main() {     HeapString s;     HeapString t;     char sub_src[16] = "00";     //s.ch = "12345";     s.ch = (char *)malloc(sizeof(char) * 16);     if (!s.ch)         return -1;     memset(s.ch, 0, 16);     memcpy(s.ch, "12345", 6);     //t.ch = "00";     t.ch = sub_src;     s.len = 5;     t.len = 2;     if(StrInsert(&s,3,t))         printf("%s\n",s.ch);     return 0; } 供参考～  楼主的用例是指向了只读数据段的位置，所以不能进行读写  如果看到函数里有free，就要考虑在调用子函数之前是用malloc的，另外函数里也有问题，循环应该从0开始。

user: user-0
content: #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct{ 	char* ch; 	int len; }HeapString; int StrInsert(HeapString* s,int pos,HeapString t); int StrInsert(HeapString* s,int pos,HeapString t) { 	int i; 	char* temp; 	if(pos<1||pos>s->len+1||s->len==0) 	return 0; 	temp=(char*)malloc(s->len+t.len); 	if(temp==NULL) 	return 0; 	for(i=1;i<pos;i++) 	temp[i]=s->ch[i]; 	for(i=1;i<t.len;i++) 	temp[i+pos]=t.ch[i]; 	for(i=pos;i<s->len;i++) 	temp[i+t.len]=s->ch[i]; 	s->len+=t.len; 	free(s->ch); 	s->ch=temp; 	return 1; } int main() { 	HeapString s; 	HeapString t; 	s.ch="12345"; 	t.ch="00"; 	s.len=5; 	t.len=2; 	if(StrInsert(&s,3,t)) 	printf("%s",s.ch); 	return 0; }

user: user-2
content: 引用 6 楼 肥牛肉^*^ 的回复:[quote=引用 5 楼 肥牛肉^*^的回复:][quote=引用 3 楼 自信男孩的回复:]这个程序是用空间换时间的方法，就是先定义一个总长是源串长度加上要插入的串长度，第一个循环是插入位置之前的源串字符先放到新申请的空间里，然后把要插入的字符串放到新申请的空间里，最后把源串从pos往后的字符再放到新申请的字符串里。把源串的空间释放，把新申请的空间地址赋值给ch。 可以给个例子吗，比如赋值s-＞ch=“12345” t.ch=“00”，定义一个结构体struct ｛char* ch，int len｝[/quote] 这个要怎样把00插入3的前面，我按循环一个来，好像不行[/quote] 把你的代码贴出来，看看是不是代码的问题～

user: user-0
content: 引用 5 楼 肥牛肉^*^的回复:[quote=引用 3 楼 自信男孩的回复:]这个程序是用空间换时间的方法，就是先定义一个总长是源串长度加上要插入的串长度，第一个循环是插入位置之前的源串字符先放到新申请的空间里，然后把要插入的字符串放到新申请的空间里，最后把源串从pos往后的字符再放到新申请的字符串里。把源串的空间释放，把新申请的空间地址赋值给ch。 可以给个例子吗，比如赋值s-＞ch=“12345” t.ch=“00”，定义一个结构体struct ｛char* ch，int len｝[/quote] 这个要怎样把00插入3的前面，我按循环一个来，好像不行

user: user-0
content: 引用 3 楼 自信男孩的回复:这个程序是用空间换时间的方法，就是先定义一个总长是源串长度加上要插入的串长度，第一个循环是插入位置之前的源串字符先放到新申请的空间里，然后把要插入的字符串放到新申请的空间里，最后把源串从pos往后的字符再放到新申请的字符串里。把源串的空间释放，把新申请的空间地址赋值给ch。 可以给个例子吗，比如赋值s-＞ch=“12345” t.ch=“00”，定义一个结构体struct ｛char* ch，int len｝

user: user-2
content: https://blog.csdn.net/weixin_30662109/article/details/96733617?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase 供参考～

user: user-2
content: 这个程序是用空间换时间的方法，就是先定义一个总长是源串长度加上要插入的串长度，第一个循环是插入位置之前的源串字符先放到新申请的空间里，然后把要插入的字符串放到新申请的空间里，最后把源串从pos往后的字符再放到新申请的字符串里。把源串的空间释放，把新申请的空间地址赋值给ch。

user: user-1
content: 引用 1 楼 qybao 的回复:那就要看HeapString这个结构体是怎么管理内部的字符串了，它应该提供访问内部字符串的方法，可能里面会跳过0位置的字符。所以你要结合HeapString这个结构体提供的访问函数来看到这个插入函数。 或者说它的0位置的字符用来做别的用途，比如判断字符串内存是否被释放了（因为感觉它像是在模拟堆内存的字符串，它应该提供一个控制为来判断堆是否被使用，也就是是否还没被释放），所以可能0位置的字符就是这个控制位。

user: user-1
content: 那就要看HeapString这个结构体是怎么管理内部的字符串了，它应该提供访问内部字符串的方法，可能里面会跳过0位置的字符。所以你要结合HeapString这个结构体提供的访问函数来看到这个插入函数。