C++ 将std::string转换为vector
我正在尝试将std::string转换为char*复制,而不是强制转换,因为必须将一些数据传递给一个过时的API 表面上看,有很多方法可以做到这一点,但有人建议我把它作为一个向量来做,这似乎是明智的。然而,当我尝试这一点时,结果是混乱的。代码如下:C++ 将std::string转换为vector,c++,string,vector,char,C++,String,Vector,Char,我正在尝试将std::string转换为char*复制,而不是强制转换,因为必须将一些数据传递给一个过时的API 表面上看,有很多方法可以做到这一点,但有人建议我把它作为一个向量来做,这似乎是明智的。然而,当我尝试这一点时,结果是混乱的。代码如下: const string rawStr("My dog has no nose."); vector<char> str(rawStr.begin(), rawStr.end()); cout << "\"" <<
const string rawStr("My dog has no nose.");
vector<char> str(rawStr.begin(), rawStr.end());
cout << "\"" << (char*)(&str) << "\"" << endl;
显然不对。我查看了gdb中的向量
(gdb) print str
$1 = std::vector of length 19, capacity 19 = {77 'M', 121 'y', 32 ' ', 100 'd', 111 'o',
103 'g', 32 ' ', 104 'h', 97 'a', 115 's', 32 ' ', 110 'n', 111 'o', 32 ' ', 110 'n',
111 'o', 115 's', 101 'e', 46 '.'}
这看起来是正确的,尽管结尾没有空终止符,这是值得关注的。向量sizeofstr的大小为24,这表明字符存储为8位
哪里出错了?std::vector的实例本身不是一个字符数组,它指向一个数组。而不是char*&str尝试&str[0]
从gdb输出判断,在将向量传递给遗留API之前,您还需要在向量的末尾加上一个零。std::vector的实例本身不是一个字符数组,它指向一个数组。而不是char*&str尝试&str[0]
从gdb输出判断,在将向量传递给遗留API之前,您还需要在向量的末尾加上一个零。您需要做两件事: 1使用&str[0]获取向量中第一个字符的地址;这是绝对好的,如果有点做作,因为标准保证向量内存是连续的。不能简单地写&str,因为这是向量的地址,而不一定是第一个数据元素的地址
2如果要使用标准的类c函数将字符显示为字符串,请在向量末尾插入空终止符。我可能在第二点上错了;与我的狗关联的隐式空终止符处的rawStr.end是否没有鼻子?需要做两件事: 1使用&str[0]获取向量中第一个字符的地址;这是绝对好的,如果有点做作,因为标准保证向量内存是连续的。不能简单地写&str,因为这是向量的地址,而不一定是第一个数据元素的地址 2如果要使用标准的类c函数将字符显示为字符串,请在向量末尾插入空终止符。我可能在第二点上错了;与我的狗关联的隐式空终止符处的rawStr.end是否没有鼻子?首先,std::string不包含空终止符作为[begin,end]覆盖范围内的元素。其次,向量的地址不是向量数据的第一个元素的地址。为此,需要&str[0]或str.data: 首先,std::string不包含空终止符作为[begin,end]覆盖范围内的元素。其次,向量的地址不是向量数据的第一个元素的地址。为此,您需要&str[0]或str.data:
&str获取指向向量对象的指针,而不是指向包含的字符串 如果希望将其打印为C字符串,则需要将0推到末尾,然后输出&str[0],这将获取包含数组开头的地址 但是,这非常难看。您最好创建自己的字符串向量类(继承std::vector),或者使用精心编制的函数迭代向量,逐字打印每个元素 编辑: 如果您熟悉C++11,那么可以在这里以干净的方式使用每个带有lambda的\u:
std::for_each(str.begin(), str.end(), [](char i) -> void {std::cout << i;});
&str获取指向向量对象的指针,而不是指向包含的字符串 如果希望将其打印为C字符串,则需要将0推到末尾,然后输出&str[0],这将获取包含数组开头的地址 但是,这非常难看。您最好创建自己的字符串向量类(继承std::vector),或者使用精心编制的函数迭代向量,逐字打印每个元素 编辑: 如果您熟悉C++11,那么可以在这里以干净的方式使用每个带有lambda的\u:
std::for_each(str.begin(), str.end(), [](char i) -> void {std::cout << i;});
如果使用C++11,传递&rawStr[0]就可以了,只要它只写入null之前的值。字符串不包含null终止符作为“开始到结束”范围内的元素。其次,向量的地址不是向量数据的第一个元素的地址。@chris:[需要引用]标准中关于这一问题的措辞非常微妙和古怪,但据我所知,这并不保证是无效的-terminated@jalf,我相信这与数据与c++11中的c_str相同有关。如果你感兴趣,在这个问题上已经有了一个答案。@chris当然,它们是相同的,但它们都不是相同的s&rawStr[0]并且对该问题的回答仅表明,一旦调用c_str或data,内部字符串将以null结尾
不保证它总是以null结尾。如果使用C++11,只要传递&rawStr[0]只写入null之前的值,它就可以了。字符串不包含null结尾作为begin to end覆盖范围内的元素。第二,向量的地址不是向量数据的第一个元素的地址。@chris:[需要引用]标准中关于这个问题的措辞非常微妙和古怪,但据我所知,这并不保证为空-terminated@jalf,我相信这与数据与c++11中的c_str相同有关。如果您感兴趣,这个主题上已经有一个字符串。@chris当然,它们是相同的,但它们都不与&rawStr[0]相同,并且该问题的答案仅说明,一旦您调用c_str或data,内部字符串将以null结尾。不能保证它总是以null结尾。
std::for_each(str.begin(), str.end(), [](char i) -> void {std::cout << i;});