2012-03-14 3 views
1

:私は、コードは次のように大まか探している:const char配列とchar配列ポインタを連結する方法は?ストレート事業へ

char* assemble(int param) 
{ 
    char* result = "Foo" << doSomething(param) << "bar"; 
    return result; 
} 

今、私が得るものです:

​​

編集: doSomethingchar*を返します。

どのようにこれら2つを連結しますか?

追加情報:
コンパイラ:あなたはstd::stringstreamを使用しなければならないので、G ++ 4.4.5 GNU/Linuxの2.6.32-5-amd64の上

+0

'<<'は、右から左にではなく、左から右にグループ化することに注意してください。ですから、 'std :: cout << a << b << c'を見たとき、それは" a、b、cを連結して結果を 'std :: cout'に書き出すことを意味するのではなく、' < <'は連結演算子ではありません。これは、 '(((std :: cout << a)<< b)<< c)'を意味します。つまり、それぞれa、b、cの順番に 'std :: cout'に書きます。ストリームの 'operator <<'は、この連鎖をサポートするためにストリーム自体を返します。 –

答えて

2

"Foo"および"Bar"はリテラルであり、挿入(<<)演算子はありません。

あなたの代わりにあなたが基本的な連結行いたい場合std::stringを使用する必要があります。

std::string assemble(int param) 
{ 
    std::string s = "Foo"; 
    s += doSomething(param); //assumes doSomething returns char* or std::string 
    s += "bar"; 
    return s; 
} 
+1

これは未定義の動作です。**参照**を一時的に返しています。文字列はreturnステートメントの直後に破棄され、ダブリングリファレンス –

+0

@DavidRodríguez-dribeas:fixed :)が残されます。 – Necrolis

3

さて、あなたは、C++を使用している:

std::string assemble(int param) 
{ 
    std::stringstream ss; 
    ss << "Foo" << doSomething(param) << "bar"; 
    return ss.str(); 
}; // eo assemble 
1

"Foo""bar"タイプchar const[4]を持っています。エラーメッセージ、 から私は表現doSomething(param)が(それは機能が合理的char*を返すことができる ケースを持っていることは本当に格別だ—疑わしいです)char* を入力したことを収集します。これらのタイプはありません <<をサポートしています。

ここでは、少なくとも 連結をサポートしていないCスタイルの文字列を扱っています(少なくとも合理的ではない)。 C++では、文字列の連結 オペレータは+、ない<<あり、そしてあなたはそれのために 仕事にC++の文字列を必要とする:

std::string result = std::string("Foo") + doSomething(param) + "bar"; 

(最初の引数はstd::stringすると、暗黙的な変換意志効果に 春へ)

しかし、私はそのdoSomethingの機能を見てみましょう。 char*を返す関数を持つ が間違っています。

関連する問題