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

发布于 2024-09-28 10:33:54 字数 546 浏览 0 评论 0原文

我的项目有遗留库,它将 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

提前致谢。

My project has legacy library which consider NULL pointer as empty string.

But when I get return data from std::wstring like this,

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

pStr is not NULL but pointer which wstring point.

Can I make std::string return NULL when it has no string data?
Now I wrap every str member variable like this :

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

My working environment is
Visual Studio 2008 sp1 in Windows

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

呆橘 2024-10-05 10:33:54

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

就像您建议的那样:

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

并在必要时将其命名为

Since you only need that new behavior for interacting with that legacy library and not in all code (for example strlen() will break if you pass a null pointer into it) your best bet is to use an utility function for providing proper behavior.

Something like you suggested:

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

and call it where necessary.

剪不断理还乱 2024-10-05 10:33:54
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+ 长度的字符串都会返回正确的指针。

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;
}

Use this general functions to convert strings to pointers. All NULL or empty() / "" strings return nullptr while any 1+ length strings returns the proper pointer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文