2012-03-26 5 views
3

にNULLを返すことのiOS 5.0で、予想されるとして、それが正常に動作します...しかし、iOSの5.1で、それはNULLを返します以下char * destにstringstreamの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; 
    } 

からstd::stringstreamのコピー内容。

私は間違っていますか?どのように私のコードにパッチを当てることができますか?私はsgetnsgetn戻りstd::streamsizeないポインタ型として、NULLを返している疑い

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 

を:あなたが何をしようとして

+0

このコードは、文字列をコピーして使用した文字数を返します。また、自分の文字列ストリームを構築しない理由は、 。 – 111111

+0

私はコピーを作成しましたが、これが動作していない理由を調べたいのですが... – Alkimake

+0

@Alkimake:実際には、あなたは 'std :: stringstream'のコンテンツをコピーしていません。関数)。いくつかの奇妙な理由のために、あなたは 'ソース'から 'ss'へ、そして' ss'から 'dest'へコンテンツをコピーしています。ここで 'ss'の役割は何ですか? –

答えて

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

+0

@Alkimake:あなたはそれが '0'を正しく返していることを意味しますか? –

+0

はいそれは0を返します – Alkimake

2

は基本的にやってと同じです。 0を返すか、NULLを返す別の関数ですか?ストリームをフラッシュしてからrdbuf()に電話をかけたことがありますか?

+0

destがnullに設定されていたことを意味すると思いますか? IDKでは、これはバッファにsstreamを使用するよりはるかに良い選択肢です。代わりにstd :: stringを使用できるかどうかを確認する必要があります。 – 111111

+0

OPへの質問はコメントのためのものですが、これはフォーラムではありません(ええ、最初はそれを得るのは難しいです...) –

+0

私はあなたが "Alkimake"を意味すると仮定します。彼がそれを使うことができるなら、 'std :: string'は実際にはるかに良い選択肢です。私は同意します。 – Cornstalks

関連する問題