注册 登录
编程论坛 C语言论坛

我是个新手 想向大神们请教一个问题:设计一个函数,将一个字符串插入到另一个字符串的指定位置,要求用指针实现,以下是我的设计,部分正确,看了很久不知道哪里有错

only159 发布于 2020-12-28 16:34, 2605 次点击
#include<stdio.h>
#include<string.h>
#define N 200
 void insert(char *p,int n,char *q)
{
int i;
int len=strlen(q);
for(i=0;i<len;i++)
{
*(p+n+len+i) = *(p+n+i);
}
for(int j=0;j<len;j++)
{
*(p+n+j) = *(q+j);
}
}
int main()
{
char a[N],b[N];
 int n;
gets(a);
while(scanf("%d",&n),n>strlen(a)||n<0);
getchar();
gets(b);
insert(a,n,b);
puts(a);
 return 0;
}

11 回复
#2
rjsp2020-12-28 17:05
第一个循环就有问题吧,你有没有考虑过字符串重叠的情况?
#3
only1592020-12-28 17:11
回复 2楼 rjsp
第一个循环我是想给要插入的字符串空出位置来
#4
only1592020-12-28 17:13
回复 2楼 rjsp
可是运行没有出现字符串重叠的现象啊
#5
rjsp2020-12-28 17:14
回复 3楼 only159
所以呢?
因为“你是想给要插入的字符串空出位置来”,所以就不会出现“字符串重叠”的情况?逻辑不通呀!
建议你将第一个循环,由 从头至尾拷贝 改为 从尾至头拷贝。
#6
风过无痕19892020-12-28 17:29
回复 楼主 only159
你首先得将插入点之后的字符整体向后移 b 数组长度个单元(即 len 个单元),而不是你的程序那样一个一个移,这样移很可能会覆盖 a 数组尾部的数据。比较有效的且对初学者来说最简单的一个笨办法就是:先将移动点之后的数据,先全部移到 b 数组的末尾,然后,再将 b 数组的全部数据(包括从 a 数组移过来的数据)移到 a 数组的插入点之后,这样便完成了整体插入一段字符的任务
#7
sd2737232692020-12-28 20:45
#include <stdio.h>
#include <string.h>
char* mycpy(char* a, char* b, int* p);
int main(int argc, char const* argv[])
{
    char a[20] = "helloworld\0";
    char b[5] = "bbc\0";
    int i;
    int* p = &i;
    printf("输入要插入的下标:\n", i);
    scanf("%d", &i);
    while (i < 0 || i >= sizeof(a) / sizeof(a[0])) {
        printf("输入错误,重新输入:\n", i);
        scanf("%d", &i);
    }
    printf("%s\n", mycpy(a, b, p));
    return 0;
}

char *mycpy(char* a, char* b, int *p)
{
    int i;
    char *x = (char*)malloc(20 * sizeof(char));
    for (i = 0; i < *p; i++) {
        x[i] = a[i];
    }
    x[i] = '\0';
    strcat(x, b);
    for (i = (strlen(x)); i < (strlen(a) + strlen(b)); i++) {
        x[i] = a[i - strlen(b)];
    }
    x[strlen(a)+strlen(b)] = '\0';
    return x;
    free(x);
}
#8
sd2737232692020-12-28 20:48
我也是新人,刚学1个月,见笑了
#9
only1592020-12-28 21:09
回复 7楼 sd273723269
不好意思,我没太看懂char*x后面的
#10
rjsp2020-12-28 21:23
程序代码:

#include <stdio.h>
#include <string.h>

void insert( char* p, size_t n, const char* q )
{
    const size_t plen = strlen(p);
    const size_t qlen = strlen(q);
    if( n > plen )
        n = plen;
   
    for( size_t i=plen+1; i!=n; --i )
        p[i-1+qlen] = p[i-1];
    for( size_t i=0; i!=qlen; ++i )
        p[n+i] = q[i];
}

int main( void )
{
    char s[200] = "abcdefgh";
    insert( s, 3, "12" );
    puts( s );
}
#11
only1592020-12-28 21:43
回复 10楼 rjsp
谢谢啦,可是同样是把字符串往后挪,为什么这两个方法不一样,如果我把第一个循环改成从尾部开始呢?是不是有一样了

[此贴子已经被作者于2020-12-28 21:45编辑过]

#12
rjsp2020-12-28 21:54
回复 11楼 only159
除了 字符串重叠 之外,你的循环长度也有问题
1