5

メモリのチャンクを検索して文字列を探す必要がありますが、これらの文字列のいくつかでは、次のようにすべての文字がnullで区切ら

ています。文字。私の問題は、これを実際にメモリに取り込むことから生じます。たとえば、私はいくつかの方法を試しました。

 char* str2; 
 str2 = (char*)malloc(sizeof(char)*40);   
 memcpy((void*)str2, "123\0567\09abc", 12);    

str2が指すメモリに次のように配置します。次のような123.7.9abc..
もの
str2 = "123456789\0abcde\054321";
は、str2が次のようなメモリのブロックを指すようにします123456789.abcde,321。ここで、「。」はヌル文字であり、「、」は実際のコンマです。

したがって、ヌル文字をcstringに明確に挿入することは、改行文字を挿入するように、思ったほど簡単には機能しません。文字列ライブラリでもこれを試してみると、同様の問題が発生しました。次のように、個別の割り当てを行うことができます。

 char* str;    
 str = (char*)malloc(sizeof(char)*40);  
 strcpy(str, "123");  
 strcpy(str+4, "abc");  
 strcpy(str+8, "ABC");  

しかし、それは確かに好ましくありません。問題は、cスタイルの文字列がメモリにどのように格納されるかを理解していることにあると思います。明らかに、「abc \ 0123」は実際には61 62 63 00 31 32 33(16進数で)メモリに入れられません。どのように保存され、必要なものをどのように保存できますか?

(コードをブロックに設定しなかったこともお詫びします。質問を投稿するのはこれが初めてです。どういうわけか、「4間隔」は、どうやら私が処理できるよりも難しいです。ありがとう、Luchian。もっと改行が必要だったと思います。)

4

4 に答える 4

6

他のすべてcharにnullが含まれている場合、ほぼ確実に、実際にはUTF-16でエンコードされた文字列があります。それに応じてそれらを処理し、あなたの問題は消えます。

UTF-16が一般的なWindowsを使用していると仮定すると、そのような文字列を保持するのwchar_t*ではなく、を使用します。char*また、ワイド文字列処理関数を使用して、このようなデータを操作します。たとえば、ではwcscpyなくを使用strcpyします。

于 2012-06-13T20:11:47.697 に答える
3

\0はオクテット単位のエスケープ文字の開始シーケンスであり、単なる「ヌル文字」ではありません(それ自体を使用すると1文字になります)。


ヌル文字とそれに続くオクテットのエスケープ文字の一部としても扱われる可能性のある文字列( "\ 012" 1など)を含む文字列を定義する最も簡単な方法は、以下のCの機能を使用して文字列を分割することです。

char const * p = "123456789" "\0" "abcde" "\0" "54321";

1. 「\012」は、 3文字ではなく、同等の16進値0x0Aの文字になります。0x00、「1」および「2」。

于 2012-06-13T20:24:01.497 に答える
2

まず、1 つおきの文字が NULL であることは、ワイド文字列 (2 バイト文字で構成される文字列、実際には の配列) の明確な特徴ですunsigned shortwchar_tコンパイラと設定によっては、の代わりにdatatypecharとの代わりwcsxxx()に関数のファミリを使用する方がよい場合がありますstrxxx()

Windows では、2 バイトのワイド文字列 (技術的には UTF-16) が OS のネイティブ文字列形式であるため、あらゆる場所に存在します。

つまり、strxxx() 関数はすべて、文字列が null で終了していると想定しています。したがって、それに応じて計画します。memxxx() が助けになることもあります。

"abc\0123" は、\012 が単一の 8 進エスケープ シーケンス (8 進コード 12 (16 進数の 0a) の文字) としてコンパイラによって解釈されるため、期待どおりにメモリに入りません。回避するには、次のリテラルのいずれかを使用します。

"abc\000123"
"abc\x00123"
"abc\0""123"

チャンクから文字列を生成するスニペットは、ほとんど正しいです。むしろ使いたいだけ

strcpy(str+strlen(str)+1, "123");

これにより、次のチャンクが前のチャンクのヌル文字を超えて書き込まれることが保証されます。

于 2012-06-13T20:16:03.860 に答える