【问题标题】:Converting a C-style string to a C++ std::string将 C 风格的字符串转换为 C++ std::string
【发布时间】:2011-06-13 11:43:03
【问题描述】:

将 C 样式字符串转换为 C++ std::string 的最佳方法是什么?在过去,我使用stringstreams 完成了它。有没有更好的办法?

【问题讨论】:

  • 什么是字符串?您是指来自 MFC 的CString 吗?还是一个以 null 结尾的 char 数组(一个 C 字符串)?还是别的什么?

标签: c++ string cstring


【解决方案1】:

C++ 字符串有一个构造函数,可让您直接从 C 风格的字符串构造 std::string

const char* myStr = "This is a C string!";
std::string myCppString = myStr;

或者,或者:

std::string myCppString = "This is a C string!";

正如@TrevorHickey 在 cmets 中指出的那样,请注意确保您用于初始化 std::string 的指针不是空指针。如果是,上面的代码会导致未定义的行为。再说一次,如果你有一个空指针,有人可能会争辩说你根本没有字符串。 :-)

【讨论】:

  • 现在我也要做delete myStr; 不?
  • @BarnabasSzabolcs 不,这没有必要。您只需要删除新分配的内存。不需要释放指向字符串文字的指针。
  • 这里的每个答案都没有提到明显的边缘情况。如果您的 char* 为 NULL,则 std::string 将抛出。它不会像许多人所怀疑的那样是一个空字符串。不幸的是,stackoverflow 上的所有顶级帖子都没有提到这一点,我怀疑很多为这个简单的转换而在谷歌上搜索的人正在处理这些错误。
  • @TrevorHickey 虽然这是真的,但有人可能会争辩说 NULL 不是字符串。这是没有字符串。
  • @templatetypedef 同意。这里的答案没有错,但是关于 NULL 的免责声明在帮助他人方面会大有帮助。有许多常用函数(例如“getenv()”),在使用相同的输入调用时可能返回也可能不返回 NULL。给新来者一个简单的单行而不添加免责声明是让他们失败。
【解决方案2】:

查看字符串类的不同构造函数:documentation 您可能对以下内容感兴趣:

//string(char* s)
std::string str(cstring);

还有:

//string(char* s, size_t n)
std::string str(cstring, len_str);

【讨论】:

    【解决方案3】:

    如果你的意思是char*std::string,你可以使用构造函数。

    char* a;
    std::string s(a);
    

    或者如果string s 已经存在,只需这样写:

    s=std::string(a);
    

    【讨论】:

    • 没有。您的示例将在 std::string 的构造函数中引发逻辑错误。 'a' 不能为 NULL。
    【解决方案4】:

    C++11:重载字符串文字运算符

    std::string operator ""_s(const char * str, std::size_t len) {
        return std::string(str, len);
    }
    
    auto s1 = "abc\0\0def";     // C style string
    auto s2 = "abc\0\0def"_s;   // C++ style std::string
    

    C++14:使用来自std::string_literals命名空间的运算符

    using namespace std::string_literals;
    
    auto s3 = "abc\0\0def"s;    // is a std::string
    

    【讨论】:

      【解决方案5】:

      您可以直接从 c 字符串初始化 std::string

      std::string s = "i am a c string";
      std::string t = std::string("i am one too");
      

      【讨论】:

        【解决方案6】:

        一般情况下(不声明新存储),您可以只使用 1-arg 构造函数将 c-string 更改为字符串右值:

        string xyz = std::string("this is a test") + 
                     std::string(" for the next 60 seconds ") + 
                     std::string("of the emergency broadcast system.");
        

        但是,在构造字符串以通过引用函数来传递它时,这不起作用(我刚刚遇到的一个问题),例如

        void ProcessString(std::string& username);
        ProcessString(std::string("this is a test"));   // fails
        

        您需要将引用设为 const 引用:

        void ProcessString(const std::string& username);
        ProcessString(std::string("this is a test"));   // works.
        

        【讨论】:

          【解决方案7】:

          现在还有另一种用于 char 数组的方法。类似于std::vector的初始化,至少我记得是这样。

          char cBuf[256] = "Hello World";
          std::cout << cBuf << '\n';
          std::string str{std::begin(cBuf), std::end(cBuf)};
          std::cout << str << '\n';
          

          【讨论】:

            猜你喜欢
            • 2012-06-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-16
            • 2019-03-13
            • 2016-05-08
            • 1970-01-01
            相关资源
            最近更新 更多