Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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
Arrays 如何删除一个数组中的元素以创建另一个数组_Arrays_C - Fatal编程技术网

Arrays 如何删除一个数组中的元素以创建另一个数组

Arrays 如何删除一个数组中的元素以创建另一个数组,arrays,c,Arrays,C,我试图用C语言编写一个函数,如果第一个数组完全包含第二个数组,则该函数将从第一个数组中删除第二个数组的元素 我知道用语言提问很复杂,所以这里有一些例子: 如果Array-1为hello,Array-2为lo,则输出应为hel char removeText (char a[], char b[], int lengthA, int lengthB) { int indexB = 0, i=0; char d[lengthA]; for (; i<lengthA; i++)

我试图用C语言编写一个函数,如果第一个数组完全包含第二个数组,则该函数将从第一个数组中删除第二个数组的元素

我知道用语言提问很复杂,所以这里有一些例子:

如果Array-1为
hello
,Array-2为
lo
,则输出应为
hel


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;
}
如果Array-1为
hello-hello
,Array-2为
lo
,则输出应为
hel-hel


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;
}
如果Array-1是
hello
,Array-2是
call
(第一个数组不包含第二个数组的所有内容),那么输出应该是
hello
。(不应该改变。)

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


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

零件导致错误,但我如何修复它?

您的问题在于:

for (int k=0, j=0; k<i-lengthB; j++, k++) {
    d[k] = a[j];
}
您可能也注意到,
k
j
总是相等的

还有一个问题,如果要删除的模式不在输入的末尾,或者不在输入中,您如何编码?试试看


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

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;
}
char*removeText(char a[],char b[],int lengthA,int lengthB){
int indexB=0,i=0;
忽略int=0;
字符d[lengthA]=“”;

对于(;i+ignored函数的返回类型char没有意义。如果第一个数组是“banana”,第二个数组是“ana”;结果是“b”还是“bna”?
strstr
在这里可能会有所帮助…谢谢你的回答。它起作用了,但有一个小问题。当我尝试
hello
lo
时,输出是
hal�,但它应该是
hal
。是什么导致了这个奇怪的字符呢?
lengthA
是5,
lengthB
是2,根据需要。我认为这是因为
\0
d
中缺失了