【发布时间】:2013-08-19 06:23:13
【问题描述】:
我有两个字符串 ip1 = "192.168.145.123" 和 ip2 = "172.167.234.120"。
我可以比较这两个字符串是否相等:
strncmp(ip1,ip2) == 0
但是如何我可以找到
if (ip1 > ip2) {
...
}
我的尝试
我可以使用 sscanf:
sscanf(ip1,"%d.%d.%d.%d",&s1,&s2,&s3,&s4)
并存储数字并进行比较。 但是在 32 位中,由于上限,我无法将数字存储为整数。
因此我别无选择,只能将整数作为字符串进行比较。
【问题讨论】:
-
你指的是什么“上限”? (如果是
int的符号,你有什么理由不使用unsigned int和"%u"来阅读它们)? -
一个 IPV4 地址可以完美地存储在一个 4 字节宽的无符号整数中。正如对 your 问题之一的回答 stackoverflow.com/a/18291062/694576 中所示。
-
@JoachimPileborg 非常确定他希望 192.168.1.1 比 10.0.0.1大于。将它们存储在 32 位
int中不会这样做,但unsigned int会。 -
为什么不按字典顺序将它们作为字符串进行比较呢? IP 地址没有有意义的排序; 172.167.234.120 的时间不早于 192.168.145.123,也不比东边或更快。排序的一种用途是在数据结构中管理它们。为此,任何排序都足够了,因此它也可能是您可以计算得最快的任何排序。只要您知道没有前导零,字符串比较就可以了。如果这不是目的,那为什么 IP 地址需要排序?
-
@EricPostpischil 当然在 IP 地址中有一个顺序,例如通过路由表中的网络部分。您可能想要 qsort() 一个 IP 地址列表以使用 bsearch() 来查看一个是否已经在表中。不要妄下结论,华生 :-)