我创建了一个“地址”结构。每个地址 (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/