C++ IP到长转换c++;

C++ IP到长转换c++;,c++,visual-studio,scanf,C++,Visual Studio,Scanf,我正在尝试在c++中将IP字符串转换为long, 我不喜欢使用任何inet函数 我正在使用以下功能对其进行转换: unsigned long IPStringToLong(std::string IPAddr) { unsigned char aClassByte, bClassByte, cClassByte, dClassByte; sscanf_s(IPAddr.c_str(), IP_TO_BYTES_FORMAT, &aClassByte, &a

我正在尝试在
c++
中将IP字符串转换为long, 我不喜欢使用任何
inet
函数

我正在使用以下功能对其进行转换:

unsigned long IPStringToLong(std::string IPAddr)
{
        unsigned char aClassByte, bClassByte, cClassByte, dClassByte;
        sscanf_s(IPAddr.c_str(), IP_TO_BYTES_FORMAT, &aClassByte, &bClassByte, &cClassByte, &dClassByte);
        unsigned long IP = (aClassByte << 24) | (bClassByte << 16) | (cClassByte << 8) | dClassByte;
        std::cout << IP << std::endl;
        return IP;
}
无符号长ipstringtolog(std::string IPAddr)
{
无符号字符aClassByte、bClassByte、cClassByte、dClassByte;
sscanf_s(IPAddr.c_str(),IP_TO_BYTES_格式,&aClassByte,&bClassByte,&cClassByte,&dClassByte);

无符号长IP=(ACLASBYBASE

),你说你在使用C++,但是实际上你调用了一个C函数。这就是你的问题的原因:你找到了一点C99代码。<代码> %HU 是C99。你的VisualStudio版本不实现C99。


修复很简单,因为您需要修复更多。也不要使用
short
;虚线四元格式允许
8.24
8.8.16
。换句话说,您需要
%d.%d.%d
,并检查实际读取的字段数(返回
scanf
的值)。虽然我们做得很好,但我们还是可以使用
int部分[4]
而不是
a、b、c、d
%hh
不是有效的格式。您的意思是
%hu
吗?sscanf类函数对参数不是类型安全的。%u格式需要指向整数的指针,您给指向字符(字节)的指针,sscanf函数不知道这一点。下一个变量被销毁(运行时的调试版本发出警告)@一些编程人员,是的,谢谢!@JacekCz仍然不明白为什么它可以很好地工作short@JacekCz:是的,但即使这样,您仍然需要正确的
scanf
说明符。它不仅是大小,还包括陷阱位。非常感谢!我不完全理解您关于虚线四元格式允许8.24等的说明。您能给我指一下吗我正在阅读?@OferArial:参见维基百科。基本上,
10.1234567
10.x.x
范围内的有效地址。要将其转换为长地址,请计算
(10@OferArial:IPv4地址可以用四种不同格式中的一种表示:
a.b.c.d
a.b.c
a.b
a
。每个数字本身可以用十进制(最常见)、十六进制或八进制格式表示。其他类似的函数可以为您处理所有这些格式。请阅读
inet\u addr()
documentation可以很好地总结这些格式所代表的内容。您显示的代码只支持十进制格式的
a.b.c.d
,这是最常用的格式,但肯定不是唯一可用的格式。