首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除数组中的元素以使另一个数组

如何删除数组中的元素以使另一个数组
EN

Stack Overflow用户
提问于 2021-02-18 14:13:41
回答 1查看 65关注 0票数 2

我试图用C编写一个函数,如果第一个数组以完全相同的顺序包含第二个数组,它将从第一个数组中删除第二个数组的元素。

我知道用语言来问是很复杂的,下面是一些例子:

如果数组-1是hello,数组-2是lo,那么输出应该是hel.

如果数组-1是hello hello,数组-2是lo,那么输出应该是hel hel.

如果Array-1是hello,而Array-2是call (第一个数组并不包含第二个数组的全部),那么输出应该是hello。(它不应该改变。)

我编写了一些代码,但当我尝试第二个示例( hello hello示例)时,它给了我hello hel,而不是hel hel

代码语言:javascript
复制
char removeText (char a[], char b[], int lengthA, int lengthB) {

  int indexB = 0, i=0;
  char d[lengthA];

  for (; i<lengthA; i++) {

    if (a[i]==b[indexB]) {
      indexB++;
      if (indexB==lengthB) {
        for (int k=0, j=0; k<i-lengthB; j++, k++) {
          d[k] = a[j];
        }
      }
    }
    else {
      i -= indexB;
      indexB = 0;
    }
  }

  printf("%s", d);

  if(indexB!=lengthB) {
    return *a;
  }

  return *d;
}

int main(void) {

  char a[] = "hello hello";
  char b[] = "lo";
  int c = 11;
  int d = 2;
  
  removeText(a, b, c, d);

  return 0;
}

输出应该用return给出。printf("%s", d);部分只用于尝试代码是否有效。

我知道我的代码有什么问题。这个

代码语言:javascript
复制
if (indexB==lengthB) {
    for (int k=0, j=0; k<i-lengthB; j++, k++) {
        d[k] = a[j];
    }
}

部分导致错误,但我如何修复它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-18 14:35:56

你的问题就在台词里:

代码语言:javascript
复制
for (int k=0, j=0; k<i-lengthB; j++, k++) {
    d[k] = a[j];
}

每次在a中找到一个模式时,都会将所有a数据复制到d中,从而取消以前所做的工作。

要突出显示这一点,您应该使用一些调试信息修改代码:

代码语言:javascript
复制
printf("copy to d from a, indexd for %d to %d\n", 0, i-lengthB)
for (int k=0, j=0; k<i-lengthB; j++, k++) {
    d[k] = a[j];
}

您也可以注意到,kj总是相等的。

还有一个问题,如果要删除的模式不是在输入的末尾,或者没有出现在输入中,那么如何编写代码?试试看。

为了解决您的问题,我建议一种不同的方法:在a中为被忽略的字符设置一个计数器,并在找不到模式时复制该字符,如下所示:

代码语言:javascript
复制
char * removeText (char a[], char b[], int lengthA, int lengthB) {

  int indexB = 0, i=0;
  int ignored = 0;
  char d[lengthA] = "";

  for (; i+ignored<lengthA; i++) {

    if (a[i+ignored]==b[indexB]) {
      indexB++;
      if (indexB==lengthB) {
        ignored += lengthB;
        printf("ignored = %d\n", ignored);
      }
    }
    else {
      i -= indexB;
      indexB = 0;
      printf("d[%d] = a[%d] (%c)\n", i, i+ignored , a[i+ignored ]);
      d[i] = a[i+ignored];
    }
  }
  printf("%s", d);
  strcpy(a, d);
  return a;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66261741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档