2013-02-18 31 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'); 

你預分配你需要的緩衝區,並確保它足夠大,以適應目標字符串。

相關問題