我使用winsock函数inet_addr()
将IP地址表单字符串类型传输到u_int类型。
我使用std::string
来存储用户的输入。
但是,如果我使用inet_addr(str.c_str());
我会得到错误的输出,而如果我在它之前使用const char * temp,比如
const char * temp = str.c_str();
ip_ptr->dst.s_addr = inet_addr(temp);
我可以得到正确的输出,我无法找出原因。 这两者有什么区别?
bool fliter_ip(in_addr addr,char * target ){
{
char c[15] = { NULL };
memcpy(c, inet_ntoa(addr), 15);
char d[15] = { NULL };
memcpy(d, target, 15);
if (memcmp(c, d, 15) == 0)
return TRUE;
else
{
return FALSE;
}
}
}
这是我的代码。 我将str.c_str()作为char传递给此函数。返回值不同。
答案 0 :(得分:3)
如果您的字符串实际上短于14个字符(空终止符为+1),则会导致memcpy
15个字符的未定义行为。
前两个代码示例之间没有任何区别;如果程序看起来表现不同,那么你的程序早先已经引起了未定义的行为,你现在看到它的后续效果。
但是我不确定为什么你最初说问题出现在inet_addr(str.c_str());
,但是你继续发布fliter_ip
的代码。
请注意,您的功能可以(并且应该)替换为:
bool fliter_ip(in_addr addr,char const *target )
{
return ! strcmp( inet_ntoa(addr), target );
}
要获得有关问题的更准确帮助,请尝试生成MCVE。
答案 1 :(得分:2)
如果我使用inet_addr(str.c_str());我会得到错误的输出,而如果我在它之前使用const char * temp,...我可以得到正确的输出
将str.c_str()
直接传递给inet_addr()
的工作正常,因此如果str
不包含有效的IP地址,那么它将失败的唯一方式就是。例如,由于您从用户获取值,请确保其中没有空格或换行符。 inet_addr()
并不关心char*
来自何处,只要它指向有效内存并且为空终止,str.c_str()
确保两者都可以。