IP到长转换c ++

时间:2017-08-31 13:59:57

标签: 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, &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"

它运作得很好,我无法理解为什么。

1 个答案:

答案 0 :(得分:1)

你说你正在使用C ++,但你实际上是在调用C函数。这是你的问题的原因:你已经找到了一些C99代码。 %hhu是C99。您的Visual Studio版本未实现C99。

修复很简单,因为无论如何你还需要修复一下。也不要使用short;点四线格式也允许8.248.8.16。换句话说,您需要%d.%d.%d.%d,并检查您实际读取的字段数(返回值scanf)。虽然我们做得对,但我们也可以使用int parts[4]代替a,b,c,d