检查 C 中类似元素的数据数组

标签 c arrays compare structure

我创建了一个“地址”结构。每个地址 (xx.yy.zz.mm) 都包含一个 xx、yy、zz 和 mm 元素,它们都是整数。每个地址还有一个与之关联的“名称”元素。

我有一个最多包含 100 个地址的数组,称为“网络”。以下是网络中一些元素的示例:

186.88.1.21 泰勒
186.88.9.11 鲍勃
101.21.0.13 汤姆
111.11.3.89 查克
101.21.5.99 卢克

我需要检查每个地址,看看是否有来自同一位置的其他地址。如果元素 xx 和 yy 相同,则两个地址来自同一位置。如果同一位置有1个或多个地址,我需要输出此信息。

下面是我写的一些代码来尝试做到这一点:

char temp[11];
int nameCount;
for (i = 0; i < count; i++)
{
    char names[100][10] = {};
    strcpy(temp, network[i].name);
    temp[11] = '\0';
    nameCount = 0;
    for (j = i + 1; j < count; j++)
    {
        if (network[i].xx == network[j].xx && network[i].yy == network[j].yy)
        {
            strcpy(names[nameCount], network[j].name);
            nameCount++;
        } 
    }
    if (nameCount == 0)
        printf("No matches for %s.\n", temp);
    else
    {
        printf("%s ", temp);
        for (j = 0; j < nameCount; j++)
            printf("and %s ", names[i]);
        printf("are from the same location.\n\n");
    }
}

此代码适用于数组中来自同一位置的前两个地址,但不适用于其余地址(尽管看起来几乎是这样——它打印的是空白而不是名称,但它有正确的空格数)。我上面列出的地址的输出是(抱歉格式错误):

Tyler  
 and Bob  
 are from the same location.  

No matches for Bob  
.  
Tom  
 and [space] and [space] are from the same location.  

No matches for Chuck  
.  
Luke  
 and [space] are from the same location.  

No matches for Nick  
.

似乎还有一个换行符已添加到每个名称的末尾。

最佳答案

这里至少有几个问题。

0:temp[11] 是您定义为 11 个元素长的 char 数组中的第十二个元素。这是缓冲区溢出。

1:names[100][10] 应该是 names[100][11],这样每个元素都足够大,可以存储来自 的值>温度

2:您正在使用 strcpy(),然后插入一个终止符,大概是为了防止您从 strcpy() 复制了 10 个以上的字符。在这种情况下,您有数据溢出。您想要使用 strncpy(),然后终止字符串。

strcpy(temp, network[i].name);
temp[11] = '\0';

strncpy(temp, network[i].name, sizeof(temp) - 1);
temp[sizeof(temp) - 1] = '\0';

并替换

        strcpy(names[nameCount], network[j].name);
        nameCount++;

        strncpy(names[nameCount], network[j].name, sizeof(names[nameCount] - 1);
        names[nameCount][sizeof(nameCount) - 1] = '\0';
        nameCount++;

3:打印“and %s”列表的循环正在使用错误的变量取消引用数组。您正在使用“j”进行迭代,但将第“i”个元素拉出。

4:就换行而言,网络[i].name(对于任何 i)很可能包含您正在复制的换行符。

5:如果您有来自同一地点的三样东西,您可能会以您不希望的方式列出它们。

1.1.1.1 chuck
1.1.2.2 larry
1.1.3.3 biff

可能会输出(一旦其他错误被修复)

chuck and larry and biff are from the same location
larry and biff are from the same location
No matches for biff.

解决这个问题留作练习。

关于检查 C 中类似元素的数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1850047/

相关文章:

c# - 比较大文件的内容

arrays - 比较数组时删除匹配项

c++ - Linux,Eclipse C++,如何将 ffmpeg 库连接到您的项目?

c - 在 C 中,使用 TCP 套接字从读取调用中获取 0 意味着收到了 FIN?

java - 最佳编码方式

JavaScript - 过滤具有相同元素的数组

c - 了解有关 c 中退出函数的一行

c - 循环执行超过需要

javascript - 如何将此 API 中的数据转换为由特定 prop 组织的对象数组?

arrays - For 循环打印两个 $values 而不是一个