可以使STL string :: c_str()在没有字符串时返回NULL吗?

时间:2010-10-22 07:07:59

标签: visual-studio string visual-c++ stl

我的项目有遗留库,将NULL指针视为空字符串。

但是当我像这样从std :: wstring返回数据时,

std::wstring strData;
const wchar* pStr = strData.c_str();
ASSERT(NULL == pStr);  // ASSERT!!

pStr不是NULL,而是指向wstring的指针。

当没有字符串数据时,我可以让std :: string返回NULL吗? 现在我像这样包装每个str成员变量:

const wchar* GetName() {    // I hate this kinds of wrapping function
    if (m_Name.empty())
    {
        return NULL;
    }
    return m_Name.c_str();
}

我的工作环境是 Windows中的Visual Studio 2008 sp1

提前致谢。

2 个答案:

答案 0 :(得分:1)

由于您只需要与旧版本库交互的新行为不在所有代码中(例如strlen()如果传递null将会中断指向它的最佳选择是使用效用函数来提供正确的行为。

像你建议的那样:

const wchar* GetStringBody( const std::string& str )
{
    if( str.empty() ) {
         return 0;
    }
    return str.c_str();
}

并在必要时将其称为

答案 1 :(得分:0)

template <typename Char_t, typename Traits_t, typename Allocator_t>
inline const Char_t* StrPtr(const std::basic_string<Char_t, Traits_t, Allocator_t>& aString) {
    return (aString.empty() || !aString.front()) ? nullptr : aString.c_str();
}

template <typename Char_t>
inline const Char_t* StrPtr(const Char_t* aString) {
    return (!aString || !*aString) ? nullptr : aString;
}

使用此常规函数将字符串转换为指针。所有NULLempty() / ""字符串返回nullptr,而任何1+长度字符串返回正确的指针。