Arrays 如何删除一个数组中的元素以创建另一个数组
我试图用C语言编写一个函数,如果第一个数组完全包含第二个数组,则该函数将从第一个数组中删除第二个数组的元素 我知道用语言提问很复杂,所以这里有一些例子: 如果Array-1为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++)
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
中缺失了