我试图用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。
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);部分只用于尝试代码是否有效。
我知道我的代码有什么问题。这个
if (indexB==lengthB) {
for (int k=0, j=0; k<i-lengthB; j++, k++) {
d[k] = a[j];
}
}部分导致错误,但我如何修复它?
发布于 2021-02-18 14:35:56
你的问题就在台词里:
for (int k=0, j=0; k<i-lengthB; j++, k++) {
d[k] = a[j];
}每次在a中找到一个模式时,都会将所有a数据复制到d中,从而取消以前所做的工作。
要突出显示这一点,您应该使用一些调试信息修改代码:
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];
}您也可以注意到,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;
}https://stackoverflow.com/questions/66261741
复制相似问题