首页 > 解决方案 > 检查字符串是否包含在数组中,如果不包含则追加 (C)

问题描述

我有 2 个数组,一个称为“edges”,其中包含一个城市名称列表,另一个称为 cityNames,它被初始化为一个空字符串。

我想做的是逐个元素地移动边缘数组,看看它是否包含在 cityNames 数组中。如果是,则移动到边中的下一个元素,如果不是,则将该值附加到 cityNames 数组。

下面的代码将 edges[i].startCity 添加到 cityNames 数组,但它不检查重复项,我不知道为什么。

for (int i = 1; i < noEdges; i++) {
        for (int j = 0; j < noCities; j++) {
            if(strcmp(edges[i].startCity, cityNames[j].cityName) != 0) {
                strcpy(cityNames[i].cityName, edges[i].startCity);
            }
        }
        noCities += 1;
    }

提前致谢

标签: arrayscloopsuniquec-strings

解决方案


我会假设:

  • edges是一个已知长度的结构数组noEdges,每个结构都包含一个字符串(char 指针或 char 数组)
  • cityNames 是一个结构数组,其大小至少是不同名称的数量(可能是数组noEdges的大小)edges
  • cityNames结构包含一个 char 数组元素,其大小至少为最长名称 + 1(终止 null 时为 +1)

然后下面的代码可以给出唯一的名称:

noCity = 0;
for (int i = 0; i < noEdges; i++) {
        int dup = 0;       // expect edges[i].startCity not to be a duplicate
        for (int j = 0; j < noCities; j++) {
            if(strcmp(edges[i].startCity, cityNames[j].cityName) == 0) {
                dup = 1;   // got a duplicate
                break;     // no need to go further ...
            }
        }
        if (dup == 0) {    // not a duplicate: add it to cityNames
            strcpy(cityNames[noCities].cityName, edges[i].startCity);
            noCities += 1; // we now have one more city
        }
    }
}

推荐阅读