4

最近の質問で、のchar*代わりにパスしなければならない状況があることを学びましたstd::string。私は本当に好きstringで、不変の文字列を渡す必要がある状況では、を使用すると問題なく機能します.c_str()。私の見方では、操作が簡単な文字列クラスを利用することをお勧めします。ただし、入力が必要な関数の場合、次のようになります。

std::string str;
char* cstr = new char[500]; // I figure dynamic allocation is a good idea just
getstr(cstr);               // in case I want the user to input the limit or
str = cstr;                 // something. Not sure if it matters.
delete[] cstr;
printw(str.c_str());

明らかに、これはそうではありません、ええと、簡単です。今、私はC ++にかなり慣れていないので、木の森を実際に見ることはできません。このような状況では、すべての入力をC文字列に変換して、stringの便利なメソッドを利用するために戻す必要がありますが、Cスタイルの文字列操作に慣れることは良い考えですか?この種の絶え間ない前後の変換は、対処するにはあまりにも愚かですか?

4

2 に答える 2

3

あなたが与える例では、あなたは一般的に関数std::stringを使って行を読むことができます: http ://www.cplusplus.com/reference/string/getline/std::getline

もちろん、これはcursesライブラリが行うすべてのことを行うわけではありません。char*一部のC関数が読み込めるように非定数が必要な場合は、を使用できますvector<char>vector<char>からを作成でき、stringその逆も可能です。

std::string       a("hello, world");
std::vector<char> b(a.begin(), a.end());

// if we want a string consisting of every byte in the vector
std::string       c(b.begin(), b.end());

// if we want a string only up to a NUL terminator in the vector
b.push_back(0);
std::string       d(&b[0]);

したがって、あなたの例は次のようになります。

std::vector<char> cstr(500);
getnstr(&cstr[0], 500);
printw(&cstr[0]);
于 2010-11-03T02:04:37.987 に答える
1

ほとんどのstd::string :: c_str()実装(すべてではないにしても)は、単に内部バッファーへのポインターを返します。オーバーヘッドは一切ありません。

ただし、c_str()はconst char*char*ではなくaを返すことに注意してください。そして、関数呼び出し後にポインタが無効になること。したがって、関数が渡された文字列に書き戻すようなことをしたり、ポインタのコピーを作成したりする場合は、これを使用できません。

于 2010-11-03T01:50:01.277 に答える