2016-05-21 17 views
-1

私は決して変化しない文字列のconstのchar()

const std::string myString = "my string"; 

を持っています。

はまた、私は次の関数があります。

void myFunction(const std::string str); 

私は(私はmyFunctionに各部分を渡す)charで文字列の文字を通過し、各部分に何かをしたいです。

これは私が最初に思い付いたコードです:

for (std::size_t i = 0; i < myString.length(); ++i) { 
    myFunction(myString.at(i)); 
} 

が、それは私に、「文字列へのconst char型に変換することはできません」というエラーを与えました。

for (std::size_t i = 0; i < myString.length(); ++i) { 
    char currentChar[2] = {myString.at(i), '\0'}; 
    myFunction(currentChar); 
} 

動作しますが、私はそれについて良い感じていない。だから私は、次のコードを思い付きました。

この解決策は正しいですか?それとも、それがうまくいくのか(未定義の振る舞いのようですが、私がテストするとうまくいくのは幸運です)?

また、myFunctionの渡された文字列はconstですか?

+0

正確に 'myFunction'に渡すものを明確にしてください。あなたは文字列を渡すと言うと、 'myFunction'は文字列charをcharで調べます。しかし、残りの質問では、あなたは 'myFunction'に一つの文字を渡そうとします。 –

+0

文字列charをcharで処理しています。 'myFunction'に渡す予定の部分文字列は何ですか? – md5i

+0

それを明確にしました、それについて申し訳ありません! –

答えて

3

はい、解決策は正しいです。それは効率的でも美しくもありませんが、機能します。

myFunctionは文字列を取ります。あなたはそれを文字にすることはできません。文字と1文字の文字列は異なるものです。さらに、文字を文字列に変換するコンストラクタはありません。

myFunctionには文字列が必要なので、暗黙的に文字列に変換できる文字列、または少なくともconst char*を指定する必要があります。

myFunctionには文字ではなく文字列が本当に必要ですか?

myFunctionという文字列を受信しないことを確認してください。

+2

実際に文字から文字列を作成したい場合は、 'std :: string(1、myString.at(i))'を使います。このコンストラクタは、指定された文字の1つのコピーで構成されるstd :: stringを作成するように指示します。 – md5i

+1

@ md5i実際には、ループの外側に1文字の文字列を作成し、毎回最初の文字を変更するのが最善の方法です。このようにして、コンストラクタは一度だけ呼び出されます。 – user31264

+1

文字列が値渡しされていることを考えれば、最高でもマイクロ最適化のようです。最も重要なのは、char配列を作成するのではなく、文字列を渡すときに文字列を作成するようにユーザーに教えることです。 'std :: string :: substr'を使うことも妥当な選択肢です。 – md5i

関連する問題