我想在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;
}
IP_TO_BYTES_FORMAT
在此处定义:
#define IP_TO_BYTES_FORMAT "%hhu.%hhu.%hhu.%hhu"
打印仅用于调试。
Visual Studio抛出运行时错误:Stack corruption around variable bClassByte
,但转换确实有效。
当我将格式定义为short
时(并改变当然的代码):
#define IP_TO_BYTES_FORMAT "%hu.%hu.%hu.%hu"
它运作得很好,我无法理解为什么。
答案 0 :(得分:1)
你说你正在使用C ++,但你实际上是在调用C函数。这是你的问题的原因:你已经找到了一些C99代码。 %hhu
是C99。您的Visual Studio版本未实现C99。
修复很简单,因为无论如何你还需要修复一下。也不要使用short
;点四线格式也允许8.24
和8.8.16
。换句话说,您需要%d.%d.%d.%d
,并检查您实际读取的字段数(返回值scanf
)。虽然我们做得对,但我们也可以使用int parts[4]
代替a,b,c,d