【问题描述】
编写一个函数,利用指针在字符串s中的指定位置pos处(这里插入的位置是从1开始,不是下标)插入字符串。插入的位置和内容是从键盘输入
要求:子函数 char *InsertStr(char *s,int pos,char *t)
【输入形式】
输入主串s,输入插入的子串t,输入插入位置pos。
【输出形式】
输出插入后字符串
【样例输入】
输入:
abcde
KOBE
2
【样例输出】
aKOBEbcde
我这道题目写的有什么问题?OJ过不了。
#include<stdio.h>
#include<string.h>
char *InsertStr(char *s,int pos,char *t)
{
char n[1000];
int i,j;
for(i=0;i<pos-1;i++)
{
n[i]=s[i];
}
int e=i;
for(j=0;j<strlen(t);j++)
{
n[e++]=t[j];
}
for(i=pos-1;i<strlen(s);i++)
{
n[e++]=s[i];
}
char * N=n;
return N;
}
int main()
{
char a[500],b[500];
int pos;
scanf("%s%s%d",a,b,&pos);
printf("%s",InsertStr(a,pos,b));
return 0;
}
不要直接返回在堆栈上定义的局部变量N,因为它已经无效了
可以动态分配,具体看我给你写的那个程序
答案:
优化字符串插入函数需要考虑到以下几点:
在字符串插入时,需要将插入位置以及后面的字符往后移动,为新字符串腾出空间。这个过程会涉及到大量的内存复制,这可以通过使用指针来优化。具体实现见代码:
char *InsertStr(char *s, char *t, int pos) {
int len1 = strlen(s);
int len2 = strlen(t);
if (pos < 1 || pos > len1 + 1) { // 插入位置非法,直接返回原字符串
return s;
}
char *result = (char *)malloc(sizeof(char) * (len1 + len2 + 1));
char *p1 = s, *p2 = t, *p3 = result;
// 先将插入位置之前的字符拷贝到新的字符串中
for (int i = 0; i < pos - 1; i++) {
*(p3++) = *(p1++);
}
// 然后将要插入的字符串拷贝到新字符串中
for (int i = 0; i < len2; i++) {
*(p3++) = *(p2++);
}
// 最后将剩余的字符拷贝到新字符串中
for (int i = pos - 1; i < len1; i++) {
*(p3++) = *(p1++);
}
*p3 = '\0'; // 注意要在新字符串结尾添加'\0'
return result;
}
使用了动态分配内存之后,需要确保在函数返回之前将这些内存释放掉。否则就会造成内存泄漏。可以使用以下代码来释放动态分配的内存:
void FreeMemory(char *p) {
if (p != NULL) {
free(p);
p = NULL;
}
}
char *s = "hello, world";
char *t = "Jack";
char *result = InsertStr(s, t, 6);
printf("%s\n", result);
FreeMemory(result);
在实现字符串插入函数时,需要注意到边界条件的处理。如果插入位置小于1或大于原字符串长度加1,则直接返回原字符串。如果要插入的字符串为空,则直接返回原字符串。具体实现见代码。