关于#c语言#的问题,请各位专家解答!


#include
#include
typedef struct{
    long id;
    char name[10];
    char sex[2];
}PS;
int delet(PS* p1, int m, PS* p2, int n);
int merge(PS* p1, int m, PS* p2, int n);
void sort(PS* p, int n);
void display(PS* p, int n);
int delet(PS* p1, int m, PS* p2, int n) {
    int i, j;
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            if (p1[i].id == p2[j].id)
                p1[i] = p1[i + 1];
            m--;
        }
    }display(p1, m);
        return m;
}
int merge(PS* p1, int m, PS* p2, int n) {
    int i, j;
    PS temp;
    m = 6;
    for(j=0;jfor (i = 0; i < m; i++) {
            if (p1[i].id == p2[j].id)
                break;
            else
                i++; 
            if (i == m) {
                m++;
                p1[m] = p2[j];
                break;
            };
        }
    }
    for (i = 0; i < m; i++) {
        if (p1[i].id > p1[i + 1].id) {
            temp = p1[i];
            p1[i] = p1[i + 1];
            p1[i + 1] = temp;
        }
    };
    display(p1, m);
    return m;
}
void sort(PS* p, int n) {
    int i, j;
    PS temp;
    for (j = 0; j < n - 1; j++) {
        for (i = 0; i < n; i++) {
            if (strcmp(p[i].sex, p[i + 1].sex) > 0) {
                temp = p[i];
                p[i] = p[i + 1];
                p[i + 1] = temp;
            }
            if (strcmp(p[i].sex, p[i + 1].sex) == 0) {
                if (strcmp(p[i].name, p[i + 1].name) > 0) {
                    temp = p[i];
                    p[i] = p[i + 1];
                    p[i + 1] = temp;
                };
            };
        };
    }; display(p, n);
}
void display(PS * p, int n){
    int i;
    printf("%s:\n", *p);
    printf("ID    NAME    SEX\n");
    for (i = 0; i < n; i++) {
        printf("%ld%7s%5s\n", p[i].id, p[i].name, p[i].sex);
    };
}
int main() {
    int m=5, n=2;
    PS a[] = { {101, "tom","m"}, {103,"mary","f"}, {104,"mark","m"},
{105,"julia","f"},{106, "sara","f"} };
    PS b[] = { {102, "mark","m"},{104,"mark","m"} };    
    display(a, m);
    display(b, n);
    delet(a,m,b,n);
    merge(a,m,b,n);
    sort(a,m);
}

img

#include<stdio.h>
#include<string.h>
typedef struct{
    long id;
    char name[10];
    char sex[2];
}PS;
int delet(PS* p1, int m, PS* p2, int n);
int merge(PS* p1, int m, PS* p2, int n);
void sort(PS* p, int n);
void display(PS* p, int n);
int delet(PS* p1, int m, PS* p2, int n) {
    int i, j, num = 0;
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            if (p1[i].id == p2[j].id) 
            {num++;
             m--;
            }
            p1[i] = p1[i + num];    
           
        }
    }display(p1, m);
        return m;
}
int merge(PS* p1, int m, PS* p2, int n) {
    int i, j;
    PS temp;
    for(j=0;j<n;j++){
        p1[m+j] = p2[j];
        };
    m += n;
    display(p1, m);
    return m;
}
void sort(PS* p, int n) {
    int i, j;
    PS temp;
    for (j = 0; j < n - 1; j++) {
        for (i = j+1; i < n; i++) {
            if (strcmp(p[j].sex, p[i].sex) > 0) {
                temp = p[j];
                p[j] = p[i];
                p[i] = temp;
            }
            if (strcmp(p[j].sex, p[i].sex) == 0) {
                if (strcmp(p[j].name, p[i].name) > 0) {
                    temp = p[j];
                    p[j] = p[i];
                    p[i] = temp;
                };
            };
        };
    }; display(p, n);
}
void display(PS* p, int n){
    int i;
    printf("%s:\n", p);
    printf("ID    NAME    SEX\n");
    for (i = 0; i < n; i++) {
        printf("%ld%7s%5s\n", p[i].id, p[i].name, p[i].sex);
    };
}
int main() {
    int m=5, n=2;
    PS a[] = { {101, "tom","m"}, {103,"mary","f"}, {104,"mark","m"},
{105,"julia","f"},{106, "sara","f"} };
    PS b[] = { {102, "mark","m"},{104,"mark","m"} };    
    display(a, m);
    display(b, n);
    m = delet(a,m,b,n);
    m = merge(a,m,b,n);
    sort(a,m);
}

请问是什么问题

merge函数内对m=6;这个赋值越界了,你传的实参a原来只有5个元素。27行改成 m=m-1;

1.delet 函数中,在匹配到相同的 id 时,p1[i] 被赋值为 p1[i+1],而没有对其进行整体移位,导致最后结果中会有重复或者空元素。

2.merge 函数中,在每次执行完循环之后,i 的增加没有被放到循环内部,导致循环无法正常终止。此外,在某一个极端情况下,当 i 增加到 m 时,其增加后的值也将会被用于数组访问,造成内存溢出。

3.sort 函数中,当 strcmp 函数的返回值为 0 时,应该进行按名称排序,但是这里没有进行排序。

4.display 函数中,输出标题行时使用了 *p,但它应该是一个字符串,而不是指针。

5.在 main 函数中,定义了数组 a 和 b 的长度,但并没有使用它们来调用 display 函数。

以上是代码中存在的一些错误。

这是您代码的调试,亲测,调试后可运行:

  1. delet()函数在实现上存在逻辑错误。 要删除的元素没有移动,所以数组大小保持不变。 这是更正后的版本:
int delet(PS* p1, int m, PS* p2, int n) {
    int i, j;
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            if (p1[i].id == p2[j].id) {
                int k;
                for (k = i; k < m - 1; k++) {
                    p1[k] = p1[k + 1];
                }
                m--;
                break;
            }
        }
    }
    display(p1, m);
    return m;
}


2.在函数merge()中,m的值被硬编码为6,这是不正确的。 相反,该值应在合并后更新。 这是更正后的版本:

int merge(PS* p1, int m, PS* p2, int n) {
    int i, j;
    PS temp;
    for (j = 0; j < n; j++) {
        for (i = 0; i < m; i++) {
            if (p1[i].id == p2[j].id) {
                break;
            }
            else if (i == m - 1) {
                m++;
                p1[m - 1] = p2[j];
                break;
            }
        }
    }
    for (i = 0; i < m - 1; i++) {
        if (p1[i].id > p1[i + 1].id) {
            temp = p1[i];
            p1[i] = p1[i + 1];
            p1[i + 1] = temp;
        }
    }
    display(p1, m);
    return m;
}


3.在sort()函数中,外层循环应该迭代n-1次,而不是n次。 这是更正后的版本:

void sort(PS* p, int n) {
    int i, j;
    PS temp;
    for (j = 0; j < n - 1; j++) {
        for (i = 0; i < n - 1; i++) {
            if (strcmp(p[i].sex, p[i + 1].sex) > 0) {
                temp = p[i];
                p[i] = p[i + 1];
                p[i + 1] = temp;
            }
            else if (strcmp(p[i].sex, p[i + 1].sex) == 0) {
                if (strcmp(p[i].name, p[i + 1].name) > 0) {
                    temp = p[i];
                    p[i] = p[i + 1];
                    p[i + 1] = temp;
                }
            }
        }
    }
    display(p, n);
}


4.函数display()中,第一个printf语句不正确。

1.函数 delet 中的删除方法不正确。应该把匹配的数据向前移动,而不是覆盖。

2.函数 delet 中的 m 变量在循环过程中没有正确减小。

3.函数 merge 中的第 6 行,将 m 设置为 6 就相当于把原来的数据覆盖掉,这不符合题意。

4.函数 merge 中的内层循环有问题,如果匹配的数据不在第一位,在内层循环的结尾应该将 i 加 1,而不是加在判断语句之前。

5.函数 sort 中的排序方法存在问题。如果性别不同,需要交换位置;如果性别相同,则需要比较姓名。

6.函数 display 中的输出格式有问题,应该输出每个数据项的信息,而不是整个数组的信息。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^