2013-02-18 86 views
2

文档说:如何正确使用istream :: get(char * s,streamsize n,char delim);

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

哪些文档?此外,文档实际上非常清晰 – 2013-02-18 15:01:58

+0

好吧,我现在明白了,谢谢! http://www.cplusplus.com/reference/istream/istream/get/ – 2013-02-18 15:04:31

+0

'cplusplus.com'不好,你应该用这个:http://en.cppreference.com/w/cpp/io/basic_istream/得到 – 2013-02-18 15:05:52

回答

4

你应该预先分配大小n的存储器(由s指向的),传递到s第一和n给函数的第二个参数。这样一来,get将读出的最大n字节(包括终止空),并将它们复制到由s

如果你的缓冲区是当地指向的缓冲区(堆栈上的数组,可以说),你不必删除它(事实上你不能)然而,如果它是动态的(即由new [],malloc,operator new或其他)分配,那么你必须相应地释放它。

例如:

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

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

delete []s; 

注:虽然这是有效的,因为别人的评论,最好使用std::string代替。

+1

这是非常糟糕的代码。 [**此处不要使用'new'](http://klmr.me/slides/modern-cpp/)。 – 2013-02-18 15:18:43

+0

你不错过那个字符串的0字节吗? – 0x499602D2 2013-02-18 15:22:20

+0

@大卫,你是什么意思? – 2013-02-18 15:24:01

5

的文档是明确的:开始在s

它们存储为一个C串入阵

- s必须指向一个有效的数组这是大到足以容纳读串。

它如何可以返回的输出,其长度是不知道

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

但是,考虑到您的问题,可能更适合使用the std::string overload of getline

+0

谢谢! getline确实对我更合适。 – 2013-02-18 15:15:32

3

你应该使用这样的:

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

你预分配你需要的缓冲区,并确保它足够大,以适应目标字符串。

相关问题