使用strcpy将C ++字符串转换为Char数组

时间:2015-04-07 16:51:59

标签: c++ arrays string strcpy

出于某种原因,我试图将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]时,它给出''。有人能解释一下这里发生了什么吗?

4 个答案:

答案 0 :(得分:5)

  

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

为什么不使用.c_str(),它会为您执行此操作

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

答案 1 :(得分:4)

char aC[aS.size()];

需要:

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

以允许C字符串所需的终止'\0'

答案 2 :(得分:1)

如果您不想使用std::string::c_str()成员函数,则应该动态分配char数组,因为您无法在C ++中声明可变长度数组,例如:

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

答案 3 :(得分:1)

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

但是,如果由于缓冲区可能被更改而确实需要char数组,请使用std::vector<char>。这将绕过使用非标准语法(aC[aS.size()])的问题,并且无需动态分配内存。 std::vector<char>有效 是一个可更改的字符串缓冲区,仅包装。

#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