我正在尝试在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"

它工作正常,我不明白为什么。

最佳答案

您说您正在使用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

关于c++ - IP到长转换C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45983333/

10-12 01:35