2012-03-26 30 views
3

NULL我有一個代碼的副本std::stringstream內容char * dest字符串流sgetn返回在iOS 5.1

static size_t copyStreamData(std::stringstream & ss, char * const & source, char * dest) 
    { 
     ss.str(""); 
     ss.clear(); 
     ss << source; 
     size_t ret = ss.rdbuf()->sgetn(dest, (std::numeric_limits<size_t>::max)()) ; 
     dest[ret] = 0; 
     return ret; 
    } 

在iOS 5.0及以下能正常工作預期......但在iOS的5.1返回NULL。

我在做什麼錯了?也如何修補我的代碼?

+0

它只是應該複製字符串,然後返回它使用了多少字符,爲什麼不構造它自己的字符串流,如果它應該做我說的話那麼有更簡單的方法來做它。 – 111111 2012-03-26 14:05:32

+0

我做了複製,但是,我想找出這個不工作的原因... – Alkimake 2012-03-26 14:16:16

+0

@Alkimake:其實,你並沒有複製'std :: stringstream'的內容(至少它的內容來自功能)。由於某些奇怪的原因,您將內容從'source'複製到'ss',然後從'ss'複製到'dest'。這裏'ss'的作用是什麼? – 2012-03-26 14:34:03

回答

1

你應該選擇你的字符串表示形式。

如果您必須使用C字符串,出於某種原因,那麼您的函數被稱爲strncpy

std::strncpy(dest, source, max_size_of_dest); 

閱讀鏈接中的注意事項。

但是,如果您可以使用更好的抽象,則建議您移至std::string

void copy(std::string const& source, std::string& dest) { dest = source; } 

不必處理緩衝區的長度(因此沒有更多的往往不是搞亂了)是一個非常有力的幫助。

請注意,沒有什麼能夠阻止您在您的應用程序中操作std::string,並仍然與C方法進行通信:.c_str()幫助很大。

+0

好吧,我這樣做,但爲什麼爲什麼爲什麼緩衝區返回NULL? – Alkimake 2012-03-26 14:45:14

+0

@Alkimake:你的意思是它返回'0'吧? – 2012-03-26 15:00:15

+0

是的,它返回0 – Alkimake 2012-03-26 18:04:33

2

你試圖做的是基本相同,這樣做的:

std::size_t length = std::strlen(source) + 1; // + 1 for '\0' 
std::copy(source, source + length, dest); 
// Assuming dest has length + 1 bytes allocated for it 

我懷疑sgetn時返回NULL,爲sgetn回報std::streamsize而不是指針類型。它返回0,還是另一個返回NULL的函數?在撥打電話rdbuf()之前,您是否嘗試過沖洗流?

+0

我認爲他們的意思是dest被設置爲null? IDK,這比使用緩衝區的sstreams更好。雖然你應該看看你是否可以使用std :: string來代替。 – 111111 2012-03-26 14:26:49

+0

問題的OP是評論,這不是一個論壇(是的,它很難得到它,在第一...) – 2012-03-26 14:28:07

+0

我假設「你」你的意思是Alkimake。 'std :: string'確實是一個更好的選擇,如果他可以使用它,我會同意。 – Cornstalks 2012-03-26 14:29:43