最初の要素をnullに設定すると、char配列の内容全体がクリアされると思いました。
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
ただし、これは最初の要素をnullに設定するだけです。
または
my_custom_data[0] = 0;
memset
上記の2つの例では、を使用するのではなく、すべてのデータを消去すると思いました。
最初の要素を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または同様の何か以外のテクニックを知りません。
次のコードを試してください:
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に設定するにはどうすればよいでしょうか。
最初の文字にnull文字を書き込むと、まさにそれが可能になります。文字列として扱う場合、null終了文字に従うコードはそれをnull文字列として扱いますが、これはデータをクリアすることとは異なります。実際にデータを消去したい場合は、memsetを使用する必要があります。
私は通常次のようにします:
memset(bufferar, '\0', sizeof(bufferar));
最初の要素をnullに設定すると、char配列の内容全体がクリアされると思いました。
あなたが発見したようにそれは正しくありません
ただし、これは最初の要素をnullに設定するだけです。
丁度!
すべてのデータをクリアするにはmemsetを使用する必要があります。エントリの1つをnullに設定するだけでは不十分です。
ただし、配列の要素をnullに設定することが特別な意味を持つ場合(たとえば、null終了文字列を使用する場合)、最初の要素をnullに設定するだけで十分な場合があります。このようにして、配列にメモリ内の古い文字がまだ含まれている場合でも、配列のユーザーはそれが空であることを理解できます
最初の要素をNULLに設定します。char配列を出力しても何も返されません。
次はどうですか:
bzero(my_custom_data,40);
以下を試してください:
strcpy(my_custom_data,"");