2012-02-17 14 views
0

パラメータとしてchar str[]をとる関数があります。文字列入力を与える関数を呼びたいと思います。char配列をパラメータとして受け取る関数

void someFunction (char str[]) { 
    /* ... */ 
} 

// Works. 
someFunction("1010101"); 

// Does not work. 
string someString; 
someFunction(someString); 

2回目の電話を受けるにはどうすればよいですか?

EDIT:私は関数の入力パラメータを変更できません。あなたは、あなたの関数ではなくstd::stringを取るかもしれない

+3

'someFunction(someString.c_str());' –

+1

@Cody:はコンパイルされません、 'c_str()'はconstです。 –

+0

私は想像力にその部分を残していたので、それは単なるコメントだったのです。 'someFunction'はおそらく' const'でなければなりません。 –

答えて

2

あなたは行うことができる必要があります:

someFunction(const_cast<char*>(someString.c_str())); 

私はstrが変更されます場合はどうなるかわからないが。

元の関数を変更して別のパラメータタイプを使用するだけの方がよいでしょう。

+0

どちらも標準ではありません。だから私たちはそれを "未定義の振る舞い"と呼びます。 –

+0

これはうまくいくようです。これを使用すると何か問題がありますか?私のすべての文字列は配列に格納されているので、私はそれらを読んでいるだけで、変更されていません。 – DomX23

+0

@CodyGray私は、文字列を試して修正すると何が起こるのか分からないと書いていました。何がわからないのかは分かりません。 – Matthew

0

void someFunction (std::string &str) { 
+0

.cpp:207:error: 'const char *'から 'char *'への無効な変換 .cpp:207:エラー: 'void someFunction(char *)'の引数1を初期化する – DomX23

+1

キャスト ' const'それだけのように?どこか、幼児の神が泣いている... –

+0

'someFunction'が内容を修正しようとすると、最初のバージョンが危険になるかもしれません。 – Naveen

3

文字列の操作の性質によって異なります。文字列を読み取っても書き込まない場合は、プロトタイプをconst char str[]に変更し、someString.c_str()を使用してください。

の文字列を変更した場合、文字列の長さがではない場合は、&*someString.begin()を使用してください。

文字列を拡張/トランケートすると、string&を渡しやすくなり、文字列オブジェクトとして機能します。より少ないトラブル、正直なところ。 std::stringのデータは、(少なくとも、C++ 11の前に)連続したメモリであることが保証されていません - あなたはstd::stringのために何をしたいです

+0

これをサポートできますか?「文字を変更しますか?&* someString.begin()を使用しますか?私の懸念は、標準ライブラリでは、文字列が不変であるか、参照が何らかの方法で数えられるか、内部的には何らかの目立たない目的のためにチェックサムがあると期待できることです。SIGSEGVなどを使わずに、無関係であると予想される他の文字列に変更が反映されたり、内部クラスの不変量が無効になったりする可能性があります。それはコピーされていない新しく作成された '文字列'の場合、それは安全である可能性が非常に高いです.... –

+0

過去に私のために働いた:)また、このように考えてください。 begin()は、書き込み可能な参照を返すイテレータを返します。あなたがその参照に書き込む方法はありません。そのため、リファレンスは文字列の背後にある実際のストレージを指し示す必要があります。一時的ではありません。また、標準では文字列が連続したメモリブロックとして格納されている必要があるため、残りの文字は同じブロックにあります。 QED。 –

+0

サウンドポイントre 'begin()' - 'string someString; someFunction(someString); '疑問の使用は、非コンスバージョンを呼び出すでしょう。 –

1

void someFunction(std::string& str);

問題の理由がありますです。したがって、そのバッファを連続的な割り当て(char[])として操作することは非常に悪い考えです。

constをキャスト離してstd::string::c_str()にすることも悪い考えです。あなたが直面する可能性がある即時の問題の1つは、std::string実装が他のstd::stringインスタンス(コピーオンライト)とバッキング文字列割り当てを共有する可能性があり、他のstd::stringの値を変更することになります。もちろん、独自の実装定義の方法で間違っている可能性のある他の多くの悪いことがあります。標準によって標準ライブラリの実装者にとって非常に柔軟性があります。

EDIT: I cannot change the function's input parameters.

代わりにstd::vectorを使用してください。

関連する問題