文档说:
istream::get ( char* s, streamsize n, char delim );
// Extracts characters from the stream and stores them as a
// c-string into the array beginning at s
我试图分析这个功能的作用。它需要一个“按值”的指针。也就是说它无法分配动态内存并将指针s
设置为它。它只能更改指针s
指向的内容。
但是如果函数无法执行动态内存分配,那么如何返回长度未知的输出呢?我该如何使用这个功能?我应该预先分配内存并将指针传递给s
,然后自己将其删除吗?
答案 0 :(得分:5)
文档很清楚:
将它们作为c-string存储到从s
开始的数组中
- s
必须指向一个足以容纳读取字符串的有效数组。
如何返回长度未知的输出
最大长度是已知的,它是n
(实际上是n - 1
,因为为C字符串的空终止保留了一个字符。)
但是,考虑到您的问题,使用the std::string
overload of getline
可能更合适。
答案 1 :(得分:4)
您应该预先分配大小为s
的内存(由n
指向),将s
传递给第一个n
并将get
传递给该函数的第二个参数。这样,n
将读取最大s
个字节(包括终止null)并将它们复制到const int n = 50;
char *s = new char[n];
cin.get(s, n);
//...
delete []s;
指向的缓冲区
如果你的缓冲区是本地的(堆栈中的一个数组,让我们说),你不必删除它(事实上你不能)但是如果它是动态的(即由new []分配,malloc ,运营商新的或其他什么)然后你必须相应地释放它。
示例:
std::string
注意:虽然这是有效的,但正如其他人所评论的那样,请更好地使用{{1}}。
答案 2 :(得分:3)
您应该像这样使用它:
const int size = 10;
char s[size]; //large enough to fit string
stream.get(&s[0], size, '\n');
您预先分配了所需的缓冲区,并确保它足够大以适应目标字符串。