C语言 将一个字符串插入另一个字符串没有库函数

e5nszbig  于 2023-03-01  发布在  其他
关注(0)|答案(5)|浏览(141)

我正在尝试完成一项家庭作业,其中一部分是设计一个函数,用于将一个字符串插入另一个字符串,除了strlen()之外,所有函数都是我的禁区,具体来说,问题是这样的:我在实现函数中为插入的字符串在目标字符串中“腾出空间”的部分时遇到了麻烦。插入字符串总是会导致数组元素被践踏。有人能指出我在这里做错了什么吗?谢谢你帮助我学习!
Edit:Integer n是字符串中应该插入另一个字符串的位置。

void insertstring(char *str, char *ins, int n)
    {
        int i;
        int scoot=strlen(ins);
        char *p=str+n;

        for (i=strlen(str); i > n; --i) { //This is where I'm doing it wrong I think
            str[i+scoot]=str[i];          //
        }

        do {
            *p = *ins;
            ++p;
            ++ins;
        }
        while (*ins != '\0');
    }
ffx8fchx

ffx8fchx1#

一个优雅的解决方案是使用反转来获得所需的结果。假设您的目标字符串str由两个块AB组成,其中A是插入点之前的块,B是插入点之后的块。此外,假设要插入的字符串ins由第三个块C表示。
可以看出,如果将C连接到AB上,然后将B反转,将C反转,将B和C都反转,则得到ACB,这是所需的结果,更明确地说,这是将C附加到AB后得到的结果:
美国广播公司
这就是你想要的
ACB
ACB可通过以下方式获得:

  • B取反,得到B_r(B取反);
  • 把C倒过来,得到C_r --此时我们有AB_rC_r;
  • 将B和C取反,即计算A(B_rC_r)_r,得到ACB。

下面是实现此算法的代码:

void reverse(char *, char *, char *);
/* Insert string C between blocks AB in str */
void insertstring(char *str, char *ins, int n) {
    /* 1 - Append C to the end of str */
    int i = strlen(str);
    char *p = str+i, *q = ins;
    while ((*p++ = *q++));
    p--;
    /* 2 - Reverse C and B */
    reverse(str, str+i, p-1); /* C */
    reverse(str, str+n, str+i-1); /* B */
    /* 3 - Reverse B_rC_r */
    reverse(str, str+n, p-1);
}

void reverse(char *str, char *begin, char *end) {
    char tmp;
    while (begin < end) {
        tmp = *begin;
        *begin = *end;
        *end = tmp;
        begin++;
        end--;
    }
}

以及一些示例代码来测试它:

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

int main() {
    void insertstring(char *, char *, int);
    char test[128] = "A string to test.";
    printf("Before: %s\n", test);
    insertstring(test, "hello!", 4);
    printf("After: %s\n", test);
    return 0;
}

这将在测试[4]的开头插入“hello!”,输出如下:

$ ./test
Before: A string to test.
After: A sthello!ring to test.

考虑采用以下方法:代码简短而优雅。这种技术在Programming Pearls,2nd edition中被描述为执行矢量旋转的好方法。根据作者的说法,Brian Kernighan和P. J. Plauger在他们的Pascal软件工具中精确地使用了这种方法来在文本编辑器中移动行。

p4rjhz4m

p4rjhz4m2#

首先你有零钱

for (i=strlen(str); i > n; --i)

for (i=strlen(str); i >= n; --i)

因为你也要移动str[n]
另一个问题是在插入ins时:

do {
        *p = *ins;
        ++p;
        ++ins;
}
while (*ins != '\0');

在这里,您将终止的'\0'ins复制到str,以便丢失其余部分。

while (*ins != '\0') {
        *p = *ins;
        ++p;
        ++ins;
}
yrdbyhpb

yrdbyhpb3#

在提到n之后,将for循环更新为

for (i=n+scoot; i >= n; i--)

您要将strlen(ins)从位置n向前移动字符数。

flvlnr44

flvlnr444#

尝试单循环,
转到索引,将src内容复制到temp_array,同时将medi复制到src一旦medi复制完成,就开始放入temp_array的内容,直到其变为空

void insert_in_middle (char *src, char *medi, int index)
{
    int i=0, j = index, k=0;
    char temp_array[50];

    while(src[j] != '\0' ||  temp_array[k] != '\0')
    {
        temp_array[i] = src[j];
        if(medi[i] != '\0')
        {
            src[j] = medi[i];
        }
        else if(temp_array[k] != '\0')
        {
            src[j] = temp_array[k];
            k++;
        }
        i++; j++;
    }
    printf("src[%s]\n", src);
    printf("medi[%s]\n",medi);
    printf("temp_array[%s]\n",temp_array);
}
z9gpfhce

z9gpfhce5#

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

char *str_ins();

int main()
{
   char *test = "Hello, world!";
   printf("%s\n",test);
   str_ins(&test,strstr(test,"world"),"my ");
   printf("%s\n",test);
}

char *str_ins(a, b, c)  // insert string c into a at point b
char **a, *b, *c;
{
   char *stemp;
   int pos = strlen(*a) - strlen(b);
   stemp = (char *) malloc(strlen(*a)+strlen(c)+1);
   strncpy(stemp,*a,pos);
   strcpy(stemp+pos,c);
   strcat(stemp,b);
   free(a);
   *a = stemp;
   return *a;
}

相关问题