2

私は現在、かなり大きな文字列を持っています。私が使用したい関数はパラメーターにC文字列のみを使用するため、C文字列(char *)に変換する必要があります。

ここでの問題は、文字列に多くの \0 が含まれているため、最終的な C 文字列が元の文字列よりもずっと小さくなったことです。これらの \0 は不可欠なので、単純に削除することはできません :(...

私はそうするためにさまざまな方法を試しましたが、最も一般的なのは次のとおりです。

myString.c_str();
myString.data();

残念ながら、C 文字列は常に最初の \0 より前の元の文字列の内容のみでした。

どんな助けでも大歓迎です!

4

5 に答える 5

8

文字を含む C 文字列を作成することはできません。これは'\0'、C 文字列は定義上、'\0'(「ゼロ終了文字列」とも呼ばれる) で終了する一連の文字であるため、文字列は最初'\0'の文字列で終了するためです。

ただし、最初の文字へのポインタと文字シーケンスの長さを取るインターフェイスがあります。これらは、 を含む文字シーケンスを処理できる場合があります'\0'

に注意してください。これは、常にゼロで終了する C 文字列を返すmyString.data()一方で、ゼロで終了しない可能性のある文字シーケンスへのポインターを返すためです。mystring.c_str()

于 2010-11-21T22:29:20.690 に答える
3

これは不可能です。null は、null で終了する文字列の末尾です。文字バッファー (を使用&myString[0]) を見ると、NULL がまだそこにあることがわかります。ただし、NULL は C の文字列の途中にある有効な値ではないため、これらの NULL を正しく解釈する C 関数はありません。

于 2010-11-21T22:30:41.327 に答える
0

まあ、myStringおそらく構築/割り当て時に切り捨てられました。std::basic_string::assign2 つのイテレータを引数として取るか、単に を使用するかを試すことができstd::vector <char>ます。ユース ケースでは後者がより一般的です。そして、その C 文字列を取得する API は、長さと一緒に char ポインターを取得することを実際にサポートする必要があります。

于 2010-11-21T22:30:23.380 に答える
0

少し混乱していますが、次のとおりです。

string x("abc");
if (x.c_str()[3] == '\0')
{ cout << "there it is" << endl; }
于 2010-11-21T22:31:59.610 に答える
0

これはあなたのニーズを満たさないかもしれません。あなたは「これらの \0 は不可欠です」と言いましたが、「\0」文字をエスケープまたは置換するのはどうですか?

これらのアイデアの 1 つが機能しますか?

  1. '\0' 文字を '\t' (タブ文字、10 進数 9) に置き換えます。
  2. '\0' を 10 進数 1 や 10 進数 255 などのめったに使用されない char 値に置き換えます。
  3. たとえば、各 '\0' 文字をコード化された部分文字列 ("\000" のような 8 進数など) に置き換えて、エスケープ コードを作成します。(元の「\」も必ずコード化された値 (「\134」など) に置き換えてください)。
于 2010-11-21T23:18:45.187 に答える