2

文档说:

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,然后自己删除它吗?

4

3 回答 3

5

文档很清楚:

将它们作为 c 字符串存储到从 s 开始的数组中

s必须指向一个足够大以容纳读取字符串的有效数组。

它如何返回长度未知的输出

最大长度是已知的,它是(n实际上n - 1,因为一个字符是为 C 字符串的空终止保留的)。

但是,鉴于您的std::stringgetline问题,使用.

于 2013-02-18T15:02:49.487 回答
4

您应该预先分配 size 的内存(由 指向sn,并将其传递s给函数的第一个和 n第二个参数。这样,get将读取最大n字节(包括终止 null)并将它们复制到指向的缓冲区s

如果您的缓冲区是本地的(可以说是堆栈上的一个数组),您不必删除它(实际上您不能)但是如果它是动态的(即,由 new[]、malloc、operator new 分配或其他)然后你必须相应地释放它。

例子:

const int n = 50;
char *s = new char[n];

cin.get(s, n);
//...

delete []s;

注意:虽然这是有效的,正如其他人评论的那样,更好地使用std::string

于 2013-02-18T15:02:24.387 回答
3

你应该像这样使用它:

const int size = 10;
char s[size]; //large enough to fit string
stream.get(&s[0], size, '\n');

您预先分配所需的缓冲区并确保它足够大以适合目标字符串。

于 2013-02-18T15:04:26.513 回答