【问题标题】:Use strcpy to transform a C++ string to a Char array使用 strcpy 将 C++ 字符串转换为 Char 数组
【发布时间】:2015-06-12 08:43:03
【问题描述】:

出于某种原因,我试图将 C++ 字符串转换为 char 数组。以下是我所做的:

string aS="hello world";
char aC[aS.size()];
strcpy(aC, aS.c_str());
cout << aC[0] << endl;

string bS="veooci  m eode owtwolwwwwtwwj mooawee mdeeme  eeeec eme aemmeledmll llllleolclclcmslococecewaccocmelaeaccoaaooojutmjooooocoemoooealm omjcdmcmkemmdemmmiwecmcmteeeote eoeeeem   ecc e  yolc e w    dtoooojttttmtwtt ttjcttoowl otdooco ko mooooo  aowmemm o  et  jmc    cmlctmmcccjcccecomatocooccoeoclooomoecwooo mcdoo dcdco dddooedoemod eddeedoedje  emadleweemeeedeeeec   or o  m  wejeetoj    o ojjjlwdjjjj mjmceaeoaai laaadoaa aetmotaemmj  mmmmmmlmm cmol c  mwoaoe omav";

char bC[bS.size()];
strcpy(bC, bS.c_str());
cout << aC[0] << endl;

第一次调用 aC[0] 时,它按预期给出了“h”。但是,当第二次调用 aC[0] 时,它给出了 ''。有人可以解释一下这里发生了什么吗?

【问题讨论】:

  • char aC[aS.size()]; 不是标准 C++(数组维度需要是常量表达式,您可以使用 new 代替)。

标签: c++ arrays string strcpy


【解决方案1】:

出于某种原因,我试图将 C++ 字符串转换为 char 数组

你为什么不直接使用.c_str(),它会为你做这个

string aS="hello world";
cout << aS.c_str();

【讨论】:

    【解决方案2】:

    char aC[aS.size()];

    需要:

    char aC[aS.size() + 1];

    为了允许终止 C 字符串所需的 '\0'。

    【讨论】:

      【解决方案3】:

      如果你不想使用std::string::c_str()成员函数,那么你应该动态分配char数组,因为你不能在C++中声明变长数组,例如:

      char* bC = new char[aS.size() + 1]; // don't forget to delete[]
      strcpy(bC, bS.c_str());
      

      【讨论】:

      • 我可以知道如何获得 bC 的大小吗?由于是指针,所以 sizeof() 不起作用。
      • @Justdon'train 我以为您想将字符串“复制”到bC。为什么需要获取它的大小?
      • 我想为每个角色做一些事情。
      • @Justdon'train 它的大小就是你复制的字符串的大小,即aS.size() + 1 。您也可以使用strlen(bC) 来获取大小,因为它是一个 C 字符串。
      • 是的。只是为了好奇,如果我们得到一个指向数组的指针,有没有办法得到它的大小?
      【解决方案4】:

      如果您正在调用将更改字符串缓冲区的函数(C++ 11 之前),我可以看到更改为数组的一些实用程序。否则,如果不更改缓冲区,请使用其他解决方案,例如 c_str()。

      但是,如果由于缓冲区可能被更改而真的想要一个字符数组,请使用std::vector&lt;char&gt;。这将绕过使用非标准语法 (aC[aS.size()]) 的问题,并且无需动态分配内存。 std::vector&lt;char&gt; 实际上是一个可变的字符串缓冲区,只是被包装了。

      #include <vector>
      #include <string>
      #include <cstring>
      #include <iostream>
      
      using namespace std;
      
      int main()
      {
          string aS="hello world";
          std::vector<char> aC(aS.begin(), aS.end());  // copy
          aC.push_back(0);  // null-terminate
          cout << &aC[0] << endl;
      }
      

      输出:

      hello world
      

      现在,在需要指定字符数组指针的地方,只需传递向量中第一个元素的地址(前提是向量不为空)。

      实时示例:http://ideone.com/tF32Zt

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 2016-08-13
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        相关资源
        最近更新 更多