最初の要素をnullに設定すると、char配列の内容全体がクリアされると思いました。
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
ただし、これは最初の要素をnullに設定するだけです。
または
my_custom_data[0] = 0;
memset
を使用するのではなく、上記の2つの例ですべてのデータをクリアする必要があると考えました。
配列の表示方法によって異なります。配列を一連の文字として表示している場合、データをクリアする唯一の方法は、すべてのエントリに触れることです。 memset
はおそらくこれを達成するための最も効果的な方法です。
一方、これをC/C++ null終了文字列として表示することを選択している場合、最初のバイトを0に設定すると、文字列が事実上クリアされます。
Cの配列は単なるメモリの場所であるため、実際、my_custom_data[0] = '\0';
割り当ては最初の要素をゼロに設定し、他の要素をそのまま残します。
配列のすべての要素をクリアする場合は、各要素にアクセスする必要があります。 memset
の目的は次のとおりです。
memset(&arr[0], 0, sizeof(arr));
これは通常、これを処理する最も速い方法です。 C++を使用できる場合は、代わりにstd :: fillを検討してください。
char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);
なぜ単一の要素を設定すると配列全体がクリアされると思いますか?特にCでは、プログラマーが明示的にプログラミングしない限り、ほとんど起こりません。最初の要素をゼロ(または任意の値)に設定した場合、それは正確に行われ、それ以上は行われません。
初期化するときに、配列をゼロに設定できます。
char mcd[40] = {0}; /* sets the whole array */
それ以外の場合、memset、または同様のもの以外のテクニックは知りません。
つかいます:
memset(my_custom_data, 0, sizeof(my_custom_data));
または:
memset(my_custom_data, 0, strlen(my_custom_data));
次のコードを試してください:
void clean(char *var) {
int i = 0;
while(var[i] != '\0') {
var[i] = '\0';
i++;
}
}
memset()
を使用しないのはなぜですか?それがその方法です。
最初の要素を設定すると、残りのメモリは変更されませんが、str関数はデータを空として扱います。
Plsは、ケース1とケース2の後の配列のデータで説明した場所を見つけます。
char sc_ArrData[ 100 ];
strcpy(sc_ArrData,"Hai" );
事例1:
sc_ArrData[0] = '\0';
結果:
- "sc_ArrData"
[0] 0 ''
[1] 97 'a'
[2] 105 'i'
[3] 0 ''
ケース2:
memset(&sc_ArrData[0], 0, sizeof(sc_ArrData));
結果:
- "sc_ArrData"
[0] 0 ''
[1] 0 ''
[2] 0 ''
[3] 0 ''
最初の引数をNULLに設定するとうまくいきますが、memsetを使用することをお勧めします
いや。あなたがしているのは、最初の値を '\ 0'または0に設定することだけです。
Nullで終了する文字列を使用している場合、最初の例では、期待どおりの動作が得られますが、メモリは設定されたままです。
Memsetを使用せずにメモリをクリアする場合は、forループを使用します。
Memsetを使用する必要があります。最初の要素だけを設定しても機能しません。すべての要素を設定する必要があります。そうでない場合、最初の要素のみを0に設定する方法はありますか?
最初の文字にヌル文字を書き込むと、まさにそれが行われます。文字列として扱う場合、ヌル終了文字に従うコードはヌル文字列として扱いますが、それはデータをクリアすることとは異なります。実際にデータを消去する場合は、memsetを使用する必要があります。
以下はどうですか:
bzero(my_custom_data,40);
最初の要素をnullに設定すると、char配列の内容全体がクリアされると思いました。
あなたが発見したようにそれは正しくありません
ただし、これは最初の要素のみをnullに設定します。
まさに!
Memsetを使用してすべてのデータをクリアする必要があります。エントリの1つをnullに設定するだけでは不十分です。
ただし、配列の要素をnullに設定すると特別な意味がある場合(たとえば、null終了文字列を使用する場合)、最初の要素をnullに設定するだけで十分な場合があります。そうすれば、配列のすべてのユーザーは、配列にメモリ内の古い文字がまだ含まれているにもかかわらず、空であることを理解できます。
最初の要素をNULLに設定します。 char配列を印刷しても何も返されません。
私は通常このようにします:
memset(bufferar, '\0', sizeof(bufferar));