正在将字符串转换为const char*
Converting string into const char *
下面的代码有什么不好的地方吗?虽然它运行得很好,但在初始化它之前,我应该先为字符指针分配一个内存吗?
const char *a;
string b;
getline(cin, b) ;
a=&b[0u];
从C++11开始就很好。
在C++11之前,没有正式的保证operator[]
会返回对字符的引用,该字符将是以null结尾的字符数组(即C样式字符串)的一部分。缺少保证的一个后果是,如果b
是一个空的非const
字符串,那么&b[0u]
将是未定义的行为。
(实际实现通常表现正确,因为这是实现std::string
的唯一合理方式,但那是另一回事。)
另请参阅http://en.cppreference.com/w/cpp/string/basic_string/operator_at:
reference operator[]( size_type pos );
(…)
如果是
pos == size()
,则引用值为CharT()
的字符(null字符)。(自C++11起)
尽管如此,您发布的代码并不是特别好的风格。为什么要创建一个具有未初始化值的指针,然后稍后再为其赋值,为什么还要使用更复杂的语法呢?
以下是代码的改进版本:
std::string b;
std::getline(std::cin, b);
auto const a = b.c_str();
在这个版本中,a
是const
,所以您不能意外地使它指向其他内容;您还可以使编译器自动推导类型(char const*
)。c_str()
是一种更清晰的方式来说明代码的实际含义。
根据@goodsvibration的建议,您应该使用c_str
->原因:如果您使用的编译器不支持C++11和更高版本的标准,std::string
对象将不包括适当的null终止,这在使用类C方法时表示字符串的结束。c_str
注意正确的"格式"。有关更多信息,请参阅此stackoverflow链接。
希望能有所帮助。
只需使用字符串::c_str()方法即可获得const char*
string strText = "My String";
const char * chText = strText.c_str ();
这个有两种方法
std::string::c_str
std::string::data
您可以根据口味、可读性等使用任何人。
std::string s;
std::getline(std::cin, s);
const char * a = s.c_str();