出于某种原因,我试图将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]时,它给出''。有人能解释一下这里发生了什么吗?
答案 0 :(得分:5)
答案 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
现在,在需要指定字符数组指针的地方,只需传递向量中第一个元素的地址(假设向量不为空)。