3

文字配列が変更されるたびに文字列も変更されるように、文字配列を文字列に関連付ける方法を探しています。char 配列と文字列変数の両方をユニオンに入れようとしましたが、コンパイラが不平を言ったのでうまくいきませんでした...

どんなアイデアでも大歓迎です...

4

4 に答える 4

0

問題は、 std::string が内部の文字列配列を変更する可能性があることです (特にサイズが変更された場合)。たとえば、c_str は現在の文字列のアドレスを返します。ドキュメントには、「返されたポインターは、オブジェクトを変更する他のメンバー関数への呼び出しによって無効になる可能性がある」と記載されています。

文字列メソッドを呼び出さないことが確実な場合 (したがって、文字列は同じメモリ位置に留まります)、c_str ポインター (char 配列) に直接アクセスして、その内容を変更してみてください。

std::string str = "test";
char* arr = (char*)str.c_str();
arr[3] = 'a';

注: テストのコンテキストでない限り、これに対して強くお勧めします。

つまり、文字列クラスは、メモリ内の同じ場所に留まることを保証しません。つまり、char 配列を介してアクセスしようとすることは不可能です。

最良の方法は、char 配列を常に同じサイズに保つ (したがって、常に同じメモリ位置にとどまることができる) 別の文字列クラスを作成することです。文字列サイズの変更に対処するために、より大きな配列 (たとえば、最大サイズの文字列) を作成することもできますが、これはラッパー クラスで強制する必要があります。

于 2013-08-12T15:42:50.107 に答える
0

これを行うことはできますが、行うべきではありません

#include <iostream>
#include <string>

int main()
{
   std::string test("123456789");
   std::cout << test << "\n";
   char* data = &test.front(); // use &(*test.begin()) for pre-C++11 code
   for ( size_t i(0); i < test.size(); ++i )
   {
      data[i] = 57 - i;
   }
   std::cout << test << "\n";
}

出力は

123456789
987654321

しかし、これもまた、すべてstd::stringがあなたのために容易にしようとしている. を使用するdataと、UB が発生するリスクがあり、 への変更によってガベージが発生するtest可能性があります。data

于 2013-08-12T15:45:40.100 に答える