繁体   English   中英

如何比较std :: wstring&char *?

[英]HowTo compare std::wstring & char*?

我有的:

  • [wstr1] 1 std :: wstring value(例如“(GMT + 04:30)Kabul”)
  • [str2] 1个字符*填充与std :: wstring相同的数据(文本相同)

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

这是从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调试器中的字符串在视觉上是相等的。

问题 :为什么比较方法总是给我

谢谢。


解决方案 :非常感谢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。 我做了一些改变。

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

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

但我怀疑在你的情况下,你只希望简单的ASCII字符匹配,在这种情况下你可以做一个char-by-char比较,比较wchar_t s和char s。 注意: 不要使用强制做到这一点。

至于你的转换无效的原因,请参阅@ Erik的回答。

比如这样,如果你确定你只有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());
}

您需要将newsize而不是origsize传递newsize origsize

另外,考虑使用:

wchar_t wcstring[newsize] = { 0 };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM