直接使用Str.c_str()并使用它初始化const char *有什么区别?

时间:2014-07-20 06:34:00

标签: c++ string winsock

我使用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传递给此函数。返回值不同。

2 个答案:

答案 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()确保两者都可以。