web-dev-qa-db-ja.com

文字配列を空にする方法は?

Charメンバー[255]のようなcharの配列を持ちます。ループを使用せずに完全に空にするにはどうすればよいですか?

char members[255];

「空」とは、何らかの値が保存されている場合、保存しないことを意味します。たとえば、strcatを実行すると、古い値は残りません

members = "old value";

//empty it efficiently
strcat(members,"new"); // should return only new and not "old value new"
67
Alex Xander

を使用して

  memset(members, 0, 255);

一般に

  memset(members, 0, sizeof members);

配列がスコープ内にある場合、または

  memset(members, 0, nMembers * (sizeof members[0]) );

ポインタ値のみがあり、nMembersが配列内の要素の数である場合。


編集もちろん、今では要件は配列をクリアするという一般的なタスクから文字列を完全にリセットするように変更されました。memsetはやり過ぎで、最初の要素をゼロにするだけで十分です(他の回答に記載)。


編集memsetを使用するには、string.hを含めるにする必要があります。

138
Steve Gilham

「空」の意味に依存します。

members[0] = '\0';
33
Felix

char members [255] = {0};

7
user44556

EDIT:質問に対する最新の編集を指定すると、これは機能しなくなりますnull終了がないため、配列を印刷しようとすると、文字の後に人間が読めない文字がいくつか続きます。しかし、私はこの答えを後世のコミュニティWikiとして残しています。

char members[255] = { 0 };

うまくいくはずです。 Cプログラミング言語によると:

配列のサイズが固定されている場合、初期化子の数は配列のメンバーの数を超えることはできません。少ない場合、残りのメンバーは0で初期化されます。

これは、配列のすべての要素の値が0であることを意味します。0がcharの有効な値であるため、これが「空」であるかどうかはわかりません。

4
Thomas Owens

文字列を処理している場合、char配列をゼロにしようとしないでください。以下は、文字列を操作する簡単な方法です。

コピー(新しい文字列を割り当てる):

strcpy(members, "hello");

連結(文字列を追加):

strcat(members, " world");

空の文字列:

members[0] = 0;

そのようなシンプル。

4

bzero(array name, no.of bytes to be cleared);を使用

3
Chibi.Coder

配列自体を空にすることはできません。常に同じ量のデータが含まれています。

より大きなコンテキストでは、配列内のデータは空の項目リストを表す場合がありますが、配列に加えて定義する必要があります。これを行う最も一般的な方法は、有効なアイテムの数を保持する(pmgによる回答を参照)か、文字列がゼロ文字で終了する(Felixによる回答)ことです。より複雑な方法もあります。たとえば、リングバッファは、データが追加および削除される位置に2つのインデックスを使用します。

3
starblue

私は一緒に行きます

members_in_use = 0;
2
pmg
members[0] = 0;

要件を考えれば十分です。

ただし、これはバッファーを「空にする」わけではないことに注意してください。メモリはまだ割り当てられており、有効な文字値がまだ存在している可能性があります。

2

シンプルな方が良い-理にかなっていますか?

この場合、ちょうどmembers [0] = 0が機能します。単純な質問をそれほど複雑にしないでください。

1
Test

0にリセットすることを意味する場合、「配列を空にする」ことにより、bzeroを使用できます。

#include <strings.h>  
void bzero(void *s, size_t n);  

配列を他のデフォルト文字で埋めたい場合は、memset関数を使用できます。

#include <string.h>  
void *memset(void *s, int c, size_t n);  
1
secureBadshah

次の指示を使用できます。

strcpy_s(members, "");
0
user8853435

免責事項:私は通常Cでプログラミングしないので、私の例には構文の落とし穴があるかもしれませんが、表現しようとしているアイデアが明確であることを願っています。

「空にする」とは「空の文字列を含む」ことを意味する場合、最初の配列項目をゼロに割り当てるだけで、配列に事実上empry文字列を含めることができます。

members[0] = 0;

「空にする」とは「使用中のメモリを解放する」ことを意味する場合、最初は固定char配列を使用しないでください。むしろ、charへのポインタを定義してから、必要に応じてmalloc/free(または文字列割り当て)を行う必要があります。

静的な文字列のみを使用した例:

char* emptyString="";
char* members;

//Set string value
members = "old value";

//Empty string value
member = emptyString

//Will return just "new"
strcat(members,"new");
0
Konamiman