web-dev-qa-db-ja.com

文字配列cのクリア

最初の要素をnullに設定すると、char配列の内容全体がクリアされると思いました。

char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';

ただし、これは最初の要素をnullに設定するだけです。

または

my_custom_data[0] = 0; 

memsetを使用するのではなく、上記の2つの例ですべてのデータをクリアする必要があると考えました。

100
ant2009

配列の表示方法によって異なります。配列を一連の文字として表示している場合、データをクリアする唯一の方法は、すべてのエントリに触れることです。 memsetはおそらくこれを達成するための最も効果的な方法です。

一方、これをC/C++ null終了文字列として表示することを選択している場合、最初のバイトを0に設定すると、文字列が事実上クリアされます。

109
JaredPar

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);
69
John Feminella

なぜ単一の要素を設定すると配列全体がクリアされると思いますか?特にCでは、プログラマーが明示的にプログラミングしない限り、ほとんど起こりません。最初の要素をゼロ(または任意の値)に設定した場合、それは正確に行われ、それ以上は行われません。

初期化するときに、配列をゼロに設定できます。

char mcd[40] = {0}; /* sets the whole array */

それ以外の場合、memset、または同様のもの以外のテクニックは知りません。

22
abelenky

つかいます:

memset(my_custom_data, 0, sizeof(my_custom_data));

または:

memset(my_custom_data, 0, strlen(my_custom_data));
10
Sandy

次のコードを試してください:

void clean(char *var) {
    int i = 0;
    while(var[i] != '\0') {
        var[i] = '\0';
        i++;
    }
}
8

memset()を使用しないのはなぜですか?それがその方法です。

最初の要素を設定すると、残りのメモリは変更されませんが、str関数はデータを空として扱います。

7
John Fricker

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を使用することをお勧めします

6
AKN

いや。あなたがしているのは、最初の値を '\ 0'または0に設定することだけです。

Nullで終了する文字列を使用している場合、最初の例では、期待どおりの動作が得られますが、メモリは設定されたままです。

Memsetを使用せずにメモリをクリアする場合は、forループを使用します。

4
Alan

Memsetを使用する必要があります。最初の要素だけを設定しても機能しません。すべての要素を設定する必要があります。そうでない場合、最初の要素のみを0に設定する方法はありますか?

3
Michael

最初の文字にヌル文字を書き込むと、まさにそれが行われます。文字列として扱う場合、ヌル終了文字に従うコードはヌル文字列として扱いますが、それはデータをクリアすることとは異なります。実際にデータを消去する場合は、memsetを使用する必要があります。

2
tvanfosson

以下はどうですか:

bzero(my_custom_data,40);
1
codeconnundrum

最初の要素をnullに設定すると、char配列の内容全体がクリアされると思いました。

あなたが発見したようにそれは正しくありません

ただし、これは最初の要素のみをnullに設定します。

まさに!

Memsetを使用してすべてのデータをクリアする必要があります。エントリの1つをnullに設定するだけでは不十分です。

ただし、配列の要素をnullに設定すると特別な意味がある場合(たとえば、null終了文字列を使用する場合)、最初の要素をnullに設定するだけで十分な場合があります。そうすれば、配列のすべてのユーザーは、配列にメモリ内の古い文字がまだ含まれているにもかかわらず、空であることを理解できます。

1
hhafez

最初の要素をNULLに設定します。 char配列を印刷しても何も返されません。

1
Bryan

私は通常このようにします:

memset(bufferar, '\0', sizeof(bufferar));
0