文字配列が変更されるたびに文字列も変更されるように、文字配列を文字列に関連付ける方法を探しています。char 配列と文字列変数の両方をユニオンに入れようとしましたが、コンパイラが不平を言ったのでうまくいきませんでした...
どんなアイデアでも大歓迎です...
問題は、 std::string が内部の文字列配列を変更する可能性があることです (特にサイズが変更された場合)。たとえば、c_str は現在の文字列のアドレスを返します。ドキュメントには、「返されたポインターは、オブジェクトを変更する他のメンバー関数への呼び出しによって無効になる可能性がある」と記載されています。
文字列メソッドを呼び出さないことが確実な場合 (したがって、文字列は同じメモリ位置に留まります)、c_str ポインター (char 配列) に直接アクセスして、その内容を変更してみてください。
std::string str = "test";
char* arr = (char*)str.c_str();
arr[3] = 'a';
注: テストのコンテキストでない限り、これに対して強くお勧めします。
つまり、文字列クラスは、メモリ内の同じ場所に留まることを保証しません。つまり、char 配列を介してアクセスしようとすることは不可能です。
最良の方法は、char 配列を常に同じサイズに保つ (したがって、常に同じメモリ位置にとどまることができる) 別の文字列クラスを作成することです。文字列サイズの変更に対処するために、より大きな配列 (たとえば、最大サイズの文字列) を作成することもできますが、これはラッパー クラスで強制する必要があります。
これを行うことはできますが、行うべきではありません
#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