Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::string转换为vector_C++_String_Vector_Char - Fatal编程技术网

C++ 将std::string转换为vector

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 << "\"" <<

我正在尝试将std::string转换为char*复制,而不是强制转换,因为必须将一些数据传递给一个过时的API

表面上看,有很多方法可以做到这一点,但有人建议我把它作为一个向量来做,这似乎是明智的。然而,当我尝试这一点时,结果是混乱的。代码如下:

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;});