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