【问题标题】:C++ - copying from const char* to stringC++ - 从 const char* 复制到字符串
【发布时间】:2016-12-22 17:43:26
【问题描述】:

有没有办法在 C++ 中将字符串从 const char* 复制到 string?我正在尝试做这样的事情:

#include <iostream>
#include <string.h>

using namespace std;

int main(){

    string s1;
    const char* pStr = "Sample Text";

    for(int i = 0; i < strlen(pStr); i++)
        s1[i] = pStr[i];

    cout<<s1<<endl;

    return 0;
}

在我的情况下,s1 原来是空的。

【问题讨论】:

  • 为什么不只是s1 = pStr;std::stringhas an operator= overload for const char*。答案是正确的,您需要先调整大小才能一次复制一个(或使用push_backoperator+= 调整大小并为每个操作追加),但为什么要自己做呢?
  • 另外,旁注:虽然某些编译器可能会对其进行特殊处理以避免问题,但按照标准 C/C++,for(int i = 0; i &lt; strlen(pStr); i++) 将一遍又一遍地重新计算 pStr 的长度(每次测试条件一次)。在循环外计算一次并将其保存到一个变量中并对其进行测试,如果您必须执行此类操作,或者仅使用指针算术并在 *ptr 是 NUL 字符时停止(因此您只扫描字符串一次,而不是 1 -X 次长度,1 次复制)。
  • 奇怪的是,你为什么不先尝试显而易见的s1 = pStr;,然后看看你得到了什么结果。

标签: c++ string copying


【解决方案1】:

看看cppreferencestd::basic_stringstd::string后面的模板类)的构造函数,替代(5):

const char* pStr = "Sample Text";
string s1(pStr);

cout<<s1<<endl;

【讨论】:

    【解决方案2】:

    C++11

    #include <algorithm>
    #include <iterator>
    
    string s1;
    const char* pStr = "Sample Text";
    
    std::copy(pStr, pStr + strlen(pStr), std::back_inserter(s1));
    

    另一种方式:

    string s1;
    const char* pStr = "Sample Text";
    
    s1.assign(pStr);
    

    【讨论】:

    • 为什么还要默认构造字符串?
    • @NathanOliver 这就是 OP 所拥有的,你应该问他
    【解决方案3】:

    您应该要么将 s1 初始化为等于 strlen(pStr) 的大小只需将每个字符附加到 s1。

    使用特定大小启动 s1 将如下面的代码行所示。

    string s1(strlen(pStr));
    

    类似地,附加每个字符如下。

    for(int i = 0; i < strlen(pStr); i++)
        s1.push_back(pStr[i]);
    

    但是,除非您有特定的理由来调查每个字符,否则我建议根本不要使用循环,并按如下方式启动 s1。

    string s1{ pStr };
    

    【讨论】:

      猜你喜欢
      • 2012-10-11
      • 1970-01-01
      • 2017-04-27
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多