最初の要素を null に設定すると、char 配列の内容全体がクリアされると思いました。
char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';
ただし、これは最初の要素を null に設定するだけです。
また
my_custom_data[0] = 0;
を使用するのではなく、memset
上記の 2 つの例ですべてのデータを消去する必要があると考えました。
配列をどのように表示するかによって異なります。配列を一連の文字として表示している場合、データをクリアする唯一の方法は、すべてのエントリに触れることです。memset
おそらくこれを達成するための最も効果的な方法です。
一方、これを C/C++ ヌル終了文字列として表示することを選択している場合、最初のバイトを 0 に設定すると、文字列が効果的にクリアされます。
C の配列は単なるメモリ位置であるため、実際、my_custom_data[0] = '\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 では、プログラマーが明示的にプログラミングしない限り、ほとんど何も起こりません。最初の要素を 0 (または任意の値) に設定すると、まさにそれを実行したことになり、それ以上のことは何もありません。
初期化するときに、配列をゼロに設定できます。
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 関数はデータを空として扱います。
ケース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 文字列として扱いますが、それはデータをクリアすることと同じではありません。実際にデータを消去したい場合は、memset を使用する必要があります。
次はどうですか:
bzero(my_custom_data,40);
最初の要素を null に設定すると、char 配列の内容全体がクリアされると思いました。
あなたが発見したように、それは正しくありません
ただし、これは最初の要素を null に設定するだけです。
丁度!
memset を使用してすべてのデータを消去する必要があります。エントリの 1 つを null に設定するだけでは十分ではありません。
ただし、配列の要素を null に設定することが特別な意味を持つ場合 (たとえば、null 終端文字列を使用する場合)、最初の要素を null に設定するだけで十分な場合があります。そうすれば、配列にメモリ内の古い文字がまだ含まれていても、配列のユーザーはそれが空であることを理解できます
最初の要素を NULL に設定します。char 配列を印刷しても、何も返されません。
void clearArray (char *input[]){
*input = ' ';
}
次のことを試してください。
strcpy(my_custom_data,"");