1

我正在尝试将 a 的内容插入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

4 回答 4

11

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

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

ss.getline(a, 256);

参数是它可能在数组中写入的最大s数,而不是您要获取的字符串中的字符数。它提取的字符数由分隔符(在本例中)确定。当然,您可以创建任意数量的s from以允许其写入。请记住,它包含空字符。char\n256chara

请注意,这&a[0]是不必要的。如果需要,数组将进行数组到指针的转换。

于 2013-04-06T17:20:44.663 回答
2

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

于 2013-04-06T17:27:47.373 回答
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());
于 2013-04-06T17:22:10.477 回答
1

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

于 2013-04-06T17:23:01.473 回答