Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将一个字符串插入另一个字符串没有库函数_C_String - Fatal编程技术网

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

C 将一个字符串插入另一个字符串没有库函数,c,string,C,String,我正在尝试完成一项家庭作业,其中一部分是设计一个函数,将一个字符串插入另一个字符串。除了strlen()之外,所有函数对我都是禁止的。具体来说,问题是:我在实现函数中为插入的字符串在目标字符串中“腾出空间”的部分时遇到问题。插入字符串总是导致数组元素被践踏。有人能指出我做错了什么吗?谢谢你帮我学习 编辑:整数n是字符串中我应该插入另一个字符串的位置 void insertstring(char *str, char *ins, int n) { int i;

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

编辑:整数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');
    }

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

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

在提到
n
之后,您想将
strlen(ins)
字符数从位置
n
向前移动,将循环更新为

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

在提到
n
之后,您想将
strlen(ins)
字符数从位置
n
向前移动,将循环更新为

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

在提到
n
之后,您想将
strlen(ins)
字符数从位置
n
向前移动,将循环更新为

for (i=n+scoot; i >= n; i--)
您想先从位置
n
向前移动
strlen(ins)
字符数

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;
}
首先你有零钱

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;
}
首先你有零钱

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;
}
首先你有零钱

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;
}

一个优雅的解决方案使用反转来实现所需的结果。假设目标字符串str由两个块AB组成,其中A是插入点之前的块,B是插入点之后的块。此外,假设要插入的字符串ins由第三个块C表示

可以看出,如果将C连接到AB,然后反转B,反转C,并反转B和C,则得到ACB,这是所需的结果。更明确地说,这是将C附加到AB后的结果:

ABC

这就是你想要的:

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--;
    }
}

考虑采用这种方法:代码简短而优雅。这项技术在编程珍珠,第二版,作为一个很好的方法来执行矢量旋转中被描述。根据作者的说法,Brian Kernighan和P.J.Plauger在他们的Pascal软件工具中正是使用了这种方法来移动文本编辑器中的行。

一个优雅的解决方案使用反转来实现所需的结果。假设目标字符串str由两个块AB组成,其中A是插入点之前的块,B是插入点之后的块。此外,假设要插入的字符串ins由第三个块C表示

可以看出,如果将C连接到AB,然后反转B,反转C,并反转B和C,则得到ACB,这是所需的结果。更明确地说,这是将C附加到AB后的结果:

ABC

这就是你想要的:

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--;
    }
}

考虑采用这种方法:代码简短而优雅。这项技术在编程珍珠,第二版,作为一个很好的方法来执行矢量旋转中被描述。根据作者的说法,Brian Kernighan和P.J.Plauger在他们的Pascal软件工具中正是使用了这种方法来移动文本编辑器中的行。

一个优雅的解决方案使用反转来实现所需的结果。假设目标字符串str由两个块AB组成,其中A是插入点之前的块,B是插入点之后的块。此外,假设要插入的字符串ins由第三个块C表示

可以看出,如果将C连接到AB,然后反转B,反转C,并反转B和C,则得到ACB,这是所需的结果。更明确地说,这是将C附加到AB后的结果:

ABC

这就是你想要的:

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--;
    }
}
考虑采用这种方法:代码简短而优雅。这项技术在编程珍珠,第二版,作为一个很好的方法来执行矢量旋转中被描述。根据作者Brian Kernighan和P.J.Plauger的说法