如何比较 std::string 和 char*?

Posted

技术标签:

【中文标题】如何比较 std::string 和 char*?【英文标题】:HowTo compare std::wstring & char*? 【发布时间】:2011-02-21 15:56:30 【问题描述】:

我有什么:

[wstr1] 1 std::wstring 值(例如“(GMT+04:30) Kabul”) [str2] 1 char* 填充了与 std::wstring 相同的数据(文本相同)

我只是想比较这两个值 - 但以下代码似乎不起作用。公里。

这里是从 char* 到 std::wstring 的转换器,

std::wstring TimeZone::TimeZone::char2ws(const char* src)

    /* Convert to a wchar_t*
     * http://msdn.microsoft.com/en-us/library/ms235631(v=vs.80).aspx
     */

    // Convert to a wchar_t*
    size_t origsize = strlen(src) + 1;
    const size_t newsize = 512;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
    mbstowcs_s(&convertedChars, wcstring, origsize, src, _TRUNCATE);

    return wcstring;

之后我做了简单的比较

// wstr1 is std::wstring, with "(GMT+04:30) Kabul" string
// wstr2 = char2ws(str2), 
return (wstr1 == wstr2);

没有运气。 VSVC2008 IDE 调试器中的字符串在视觉上是相等的。

问题:为什么 compare 方法总是给我 false

谢谢。


解决方案:非常感谢Alexandre C.

bool weirdEquals(const std::wstring& str, char const* c)

    std::string c_str(c);
    if (str.size() < c_str.size())
    
        return false;
    
    return std::equal(c_str.begin(), c_str.end(), str.begin());

PS。我做了一些更改。

【问题讨论】:

wcstring[] 是栈变量,怎么返回呢?你错过了最后一个'\ 0'吗?为什么不检查来自 mbstowcs_s 的错误代码? 他按值返回 std::wstring,而不是对数组的引用。 @James “你为什么不检查来自 mbstowcs_s 的错误代码?” Errno 为 0,表示没有错误,对话成功。 【参考方案1】:

如果您确定只有 ASCII 字符,请像这样比较。 否则,您可以将自定义(取决于语言环境?)比较器传递给 std::equal

bool weirdEquals(char const* c, size_t n, const std::wstring& str)

    if (str.size() < n) return false;
    return std::equal(c, c + n, str.begin());

【讨论】:

【参考方案2】:

要比较字符串,您需要通过相同的字符集来比较它们。 wchar_tchar 显然使用不同的字符集,因此您无法使用典型的 char-for-char 字符串比较来比较它们。

通常,您会将char* 字符串转换为wchar_t* 字符串(使用mbtowcsMultiByteToWideChar),这样您就可以将它们作为Unicode 字符串进行比较,就像您正在做的那样。

但我怀疑在您的情况下,您只会期望匹配简单的 ASCII 字符,在这种情况下,您可以进行逐个字符的比较,将 wchar_ts 与 chars 进行比较。注意:不要使用演员表来做到这一点。

至于为什么您的转换不起作用,请参阅@Erik 的回答。

【讨论】:

【参考方案3】:

您需要将 newsize 而非 origsize 传递给 mbstowcs_s。

另外,考虑使用:

wchar_t wcstring[newsize] =  0 ;

【讨论】:

谢谢,但是 您需要将 newsize 而不是 origsize 传递给 mbstowcs_s。 这让我有点困惑...官方 MSDN msdn.microsoft.com/en-us/library/ms235631(v=vs.80).aspx 悲伤,在mbstowcs_s 必须是 origsize 值,不是吗? wchar_t wcstring[newsize] = 0 ; - 没有帮助

以上是关于如何比较 std::string 和 char*?的主要内容,如果未能解决你的问题,请参考以下文章

如何干净地使用:const char* 和 std::string?

如何在 C++ 中将 char 指针附加到 std::string

如何将std :: string复制到unsigned char数组?

如何将 std::string 转换为 const char*? [复制]

如何将 std::string 传递给需要 char* 的函数? [复制]

如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]