C语言中数组的“删除”

C语言中数组的“删除”,c,string,struct,C,String,Struct,所以我在一个结构中有一个字符串数组,在其中我存储了汽车车牌号,我想打印这些车牌号一个车牌号可以出现多次,在一个文件中至少出现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

所以我在一个结构中有一个字符串数组,在其中我存储了汽车车牌号,我想打印这些车牌号一个车牌号可以出现多次,在一个文件中至少出现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

您的外部循环考虑了数组的每个元素,包括已经找到并打印为副本的元素。这是无害的,当只有两个副本,但如果有任何进一步的副本可以找到,然后你会打印额外的

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


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

每次找到副本时都会打印板号,因此ASD123会打印两次,因为有3次出现

此外,为此目的修改数组是一个坏的副作用

相反,您可以计算阵列中在印版号之前存在的印版号的副本数,并仅打印只有一个副本的印版号。换句话说,仅打印任何车牌号的第一份:

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

PL r[50];
int length = 50;
// read the plate numbers, update length
for (int i = 1; i < length; i++) {
    int copies = 0;
    for (int j = 0; j < i; j++) {
        if (strcmp(r[i].plate, r[j].plate) == 0)
            copies++;
    }
    if (copies == 1)
        fprintf(f_out, "%s\n", r[i].plate);
}

请发布整个函数以及结构定义。每次发现重复项时都将进行打印。ASD123共有3份副本,因此您为2份副本打印其中的2份,为1份副本打印其中的1份。执行您正在执行的操作,但在完成您正在执行的操作后,在单独的循环中进行打印。此外,通过外部循环的i=2迭代,现在,您将看到在i=0迭代中放置的空字符串,并认为它是i=0和i=1迭代中分别放置在j=4和j=5处的空字符串的副本。当您找到解决方案时,不允许编辑您的问题。相反,请发布你的新答案……好吧,外环不是问题所在;它只会遇到唯一的字符串,因为前面的DUP将被设置为空。因此,可能的例外情况是,会遇到多个空字符串,匹配、删除并一次又一次地打印,但这是无害的冗余,因为它不会打印任何内容。内部循环是问题所在。我建议在外部循环中添加一个布尔值,当且仅当已找到dup时,该值设置为true,并抑制其他dup的输出,但不抑制其删除。您基本上是对的,@PeterA.Schneider,我已相应地更新了此答案。然而,在OP的实现中,外循环还是有点问题,因为在某些情况下,它有助于打印nullStr的副本,这将显示为额外的空行。