【发布时间】:2011-03-11 03:29:14
【问题描述】:
long ip2long( char *ip )
{
long ip2long = 0;
char B1[4], B2[4], B3[4], B4[4];
int D1, D2, D3, D4 = 0;
sscanf(ip, "%s.%s.%s.%s", B1, B2, B3, B4);
D1 = atoi(B1);
D2 = atoi(B2);
D3 = atoi(B3);
D4 = atoi(B4);
if(D1 > 255 || D2 > 255 || D3 > 255 || D4 > 255)
return 0;
ip2long = D1*256*256*256+D2*256*256+D3*256+D4;
return ip2long;
}
输入数据:127.1.1.2
为什么 D1 == 127,但 D2、D3 和 D4 == 0?
--- 更新 --- 现在代码是
unsigned long ip2long( char *ip )
{
unsigned long ip2long = 0;
unsigned int D1, D2, D3, D4 = 0;
sscanf(ip, "%u.%u.%u.%u", &D1, &D2, &D3, &D4);
if(D1 > 255 || D2 > 255 || D3 > 255 || D4 > 255)
return 0;
ip2long = D1*256*256*256+D2*256*256+D3*256+D4;
return ip2long;
}
Di 没问题,但还有另一个问题:127.1.1.2 的结果是 2130772226 而不是 2130772225,195.98.157.132 的结果是 -1016947324... 为什么?
--- 更新 2 --- 没关系,有 %d 个 instread %u。
Kornel Kisielewicz 感谢您介绍 inet_addr 函数 :)
PS 对不起我的英语不好 =\
问题已结束。
【问题讨论】:
-
重新更新:我将数字输入计算器,2130772226 看起来正确。如果不使用符号位/负值,结果将不适合 32 位长。你可以返回一个无符号长整数,一个更长的有符号值(例如
long long,如果你的编译器支持它),或者接受奇怪的负值。您还有其他错误(根据我的回答)。