首页 > 解决方案 > 从C中的数组中“删除”

问题描述

因此,我在存储车牌号的结构中有一个字符串数组,我想将出现超过 1 次(至少 2 次)的车牌号(车牌号可能出现多次)打印到文件中,但只打印一次!

    typedef struct plates {
        char plate[10];
        char gate[25];
    } PL; //does not matter in this case

    PL r[50];
    int length = 50;
    char nullStr[5] = { '\0' };
    for (int i = 0; i < length; i++) {
        for (int j = i + 1; j < length; j++) {
            if (strcmp(r[i].plate, r[j].plate) == 0) {
                strcpy(r[j].plate, nullStr);
                fprintf(f_out, "%s\n", r[i].plate);
            }
        }
    }

输入:ASD123, QWE123, ASD123, KKR332, ASD123, QWE123,

输出应该是:ASD123, QWE123

但我得到:ASD123, ASD123, QWE123

标签: cstringstruct

解决方案


您的外部循环会考虑数组的每个元素,包括那些已经找到并打印为重复的元素。当只有两份副本时,这是无害的,但如果还有其他副本要找到,那么您将打印额外的副本。

即使它已经打印了车牌号,您的内部循环也会打印它找到的每个重复项。此外,您的外部循环不为在早期迭代中复制到数组中的空字符串提供任何特殊处理,从而使您的程序容易与其他人匹配并打印它们(作为空行)。

总的来说,有多种方法可以解决问题。一种方法是跟踪哪些车牌号码是已打印的车牌号码的副本 - 例如,使用辅助阵列 - 并在处理一个副本后中止内部循环。另一种方法是随时修改数组,例如将欺骗设置为空字符串,然后在以后再次遇到空字符串时忽略它们。这要求你不要提前退出内循环,而是要在那里跟踪当前的车牌号是否已经打印,以避免多次打印。第三种方法是首先对数组进行排序,使您能够将所有车牌号副本作为一个组处理,因为它们都将位于数组的相邻位置。


推荐阅读