【问题标题】:Can make STL string::c_str() return NULL when it has no string?可以使 STL string::c_str() 在没有字符串时返回 NULL 吗?
【发布时间】:2010-10-22 07:07:58
【问题描述】:

我的项目有将 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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    因为你只需要新的行为来与那个遗留库交互并且不是在所有代码中(例如,如果你将一个空指针传递给strlen()将会中断它)您最好的选择是使用实用程序函数来提供正确的行为。

    像你建议的那样:

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

    并在必要时调用它

    【讨论】:

      【解决方案2】:
      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+ 长度的字符串都返回正确的指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-18
        • 2018-11-22
        • 2020-09-15
        • 1970-01-01
        相关资源
        最近更新 更多