将字符串转换为const char *

时间:2017-11-06 06:10:02

标签: c++ pointers

以下代码有什么不好吗?虽然它运行正常,但我应该在初始化之前先为字符指针分配一个内存吗?

const char *a;
string  b;
getline(cin, b) ;
a=&b[0u];

4 个答案:

答案 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();

在此版本中,aconst,因此您不会意外地指出其他内容;您还可以使编译器自动推导出类型(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)

这个

有两种方法
  1. std::string::c_str
  2. std::string::data
  3. 您可以根据品味,可读性等使用任何人。

    std::string s;
    std::getline(std::cin, s);
    const char * a = s.c_str();