为什么从string到char数组的赋值缺少最后一个字符?

时间:2013-04-06 17:15:57

标签: c++

我正在尝试将std::string的内容插入到char数组中。所以我创建一个字符串流并对其进行getline但由于某种原因,当我打印它时,数组a中缺少最后一个字符。这是为什么?

#include <iostream>
#include <sstream>
#include <string>

int main()
{
   std::string str = "Hello, World";
   std::stringstream ss(str);

   char a[256];

   ss.getline(&a[0], str.length());

   std::cout << a; // "Hello, Worl"
}

4 个答案:

答案 0 :(得分:11)

原因是因为getline的第二个参数应该给出您愿意放弃的缓冲区的大小而不是要提取的字符数。所以实际上,大小包括空字符。您说它希望它最多提取12个字符(字符串的长度)。由于我们需要为空字符腾出空间,当然我们只能比整个字符串少一个。

真的,你应该像这样使用它:

ss.getline(a, 256);

参数是它可能在数组中写入的{em>最大个char个数,不是你想要的字符串中的字符数采取。它提取的字符数由分隔符确定(在这种情况下为\n)。当然,您可以256使char来自a您希望允许其写入的任何数量&a[0]。请记住它包含空字符。

请注意,{{1}}是不必要的。如果需要,数组将进行数组到指针的转换。

答案 1 :(得分:2)

检查getline documentation, 第二个参数指定带有空终止字符的字符串大小,因此在您的程序中,您应该使用: ss.getline(&a[0], str.length() + 1);

答案 2 :(得分:1)

你的问题是你将一个太小的大小传递给getline(),但有更好的方法可以做到这一点。使用C ++ 11,您可以使用std::string模拟可修改的字符数组(std::string具有不可修改的成员函数):

std::string str = "Hello";
someFunc(&str[0], str.size());

但请确保someFunc不会覆盖空字符,即使它与另一个空字符一致。通过正确的尺寸以适应这种情况。

没有C ++ 11,最简单的方法可能是向量:

std::string str = "Hello";
std::vector<char> vec(str.begin(), str.end());
someFunc(&vec[0], vec.size());

答案 3 :(得分:1)

getline()的第二个参数是要写入a的最大字符数(包括空字符)。