c ++ - 为字符串赋值null

时间:2012-07-23 17:36:28

标签: c++

我自己学习C ++。我有以下代码,但它给出了错误。

#include <iostream>
#include <string>
using namespace std;


int setvalue(const char * value)
{
    string mValue;
    if(value!=0)
    {
       mValue=value;
    }
    else
    {
       mValue=0;
    }
}

int main ()
{
 const char* value = 0;
 setvalue(value);

 cin.get();
 return 0;
}

所以想创建一个接受char指针的函数,我想传递一个指向它的指针。该函数将指针指定给其成员变量。我故意传递一个空指针。以下是我得到的错误:

 D:\CPP\TestCP.cpp In function `int setvalue(const char*)': 

 note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422 candidates are: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>] 

 note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422                 std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>] 

 note C:\Dev-Cpp\include\c++\3.4.2\bits\basic_string.h:422                 std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>] 

它主要是抱怨行:mValue = 0;

为什么抱怨这条线?我不能将null赋给String?

8 个答案:

答案 0 :(得分:59)

  

我不能将null赋给String?

没有。 std::string不是指针类型;它不能成为“null”。它不能表示缺少值,这是一个空指针用来表示的。

可以通过为其分配空字符串(s = ""s = std::string())或清除它(s.clear())来使为空

答案 1 :(得分:15)

您无法将NULL0分配给C ++ std::string对象,因为该对象不是指针。这是与C风格字符串的一个关键区别; C风格的字符串可以是NULL或有效的字符串,而C ++ std::string总是存储一些值。

没有简单的解决方法。如果您想保留一个标记值(比如空字符串),那么您可以执行类似

的操作
const std::string NOT_A_STRING = "";

mValue = NOT_A_STRING;

或者,您可以存储指向字符串的指针,以便将其设置为null:

std::string* mValue = NULL;

if (value) {
    mValue = new std::string(value);
}

希望这有帮助!

答案 2 :(得分:5)

文字0的类型为int,您无法将int分配给std::string。使用mValue.clear()或指定一个空字符串mValue=""

答案 3 :(得分:4)

有两种方法可以考虑哪种方法可以实现处理C指针字符串的空指针的相同效果。

三元运算符

void setvalue(const char *value)
{
    std::string mValue = value ? value : "";

}

或简陋的if语句

void setvalue(const char *value)
{
    std::string mValue;
    if(value) mValue = value;

}

在这两种情况下,value仅在mValue 空指针时才会分配给value。在所有其他情况下(即当value 为空时),mValue将包含空字符串。

三元运算符方法可用于在没有value的值的情况下提供备用默认字符串文字:

std::string mValue = value ? value : "(NULL)";

答案 4 :(得分:2)

我不认为它是的想法(或使用nullptr使用不是指针的东西的语义),但创建一个提供&#34; nullable&#34;的课程相对简单。语义(见nullable_string)。

然而,这更适合C ++ 17 std::optional

#include <string>
#include <iostream>
#include <optional>

// optional can be used as the return type of a factory that may fail
std::optional<std::string> create(bool b)
{
    if (b)
        return "Godzilla";
    else
        return {};
}

int main()
{
    std::cout << "create(false) returned "
              << create(false).value_or("empty") << std::endl;

    // optional-returning factory functions are usable as conditions of while and if
    if (auto str = create(true))
    {
        std::cout << "create(true) returned " << *str << std::endl;
    }
}

std::optional,如示例中所示,可以转换为bool,或者您可以使用has_value()方法,具有异常访问权限等等。这为您提供了可空的语义,这似乎是Maria试图完成的事情。

如果您不想等待C ++ 17兼容性,see this answer about Boost.Optional

答案 5 :(得分:0)

else案例是不必要的,当您创建string对象时,它默认为空。

答案 6 :(得分:0)

许多C API使用空指针来指示“使用默认值”,例如mosquittopp。以下是我使用的模式,基于David Cormack的答案:

    mosqpp::tls_set(
        MqttOptions->CAFile.length() > 0 ? MqttOptions->CAFile.c_str() : NULL,
        MqttOptions->CAPath.length() > 0 ? MqttOptions->CAPath.c_str() : NULL,
        MqttOptions->CertFile.length() > 0 ? MqttOptions->CertFile.c_str() : NULL,
        MqttOptions->KeyFile.length() > 0 ? MqttOptions->KeyFile.c_str() : NULL
    );

这有点麻烦,但允许用户将所有内容保持为std::string直到API调用本身。

答案 7 :(得分:0)

compiler给出了错误,因为在分配mValue = 0时,编译器会在编译时绑定中找到赋值操作符=(int),但它不存在于字符串类中。 如果我们像mValue =(char)0一样将以下语句强制转换为char类型,则其编译成功,因为字符串类包含operator =(char)方法。