char配列を空にする方法は?


83

charmembers [255]のようなcharの配列があります。ループを使用せずに完全に空にするにはどうすればよいですか?

char members[255];

「空」とは、値が格納されている場合は格納されないことを意味します。たとえば、strcatを実行した場合、古い値は残らないはずです

members = "old value";

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

3
「配列を空にする」とはどういう意味ですか?
pmg 2009年

4
メンバー[0] =メンバー[1] =メンバー[2] =メンバー[3] ... =メンバー[255] = 0ループなし;)
John La Rooy 2009年

18
つまり、「配列」は特別な種類の配列ですstring。つまり、です。:文字列を「空」にするには、それはへの最初の要素「\ 0」だ設定members[0] = '\0';
PMG

コミュニティはmemsetを支持しているようです。しかし、私の要件を考えると、それは最も効率的な方法ですか?
Alex Xander

2
@Alex Xander:この場合、「コミュニティ」は明らかに間違っています。'memset'を必要とする状況があります(不正使用を防ぐためにデータを消去するなど)が、単純な文字列リセット(あなたの場合のように)の場合、正しい答えは最初の要素のみをゼロにすることです。
AnT 2009年

回答:


170

を使用して

  memset(members, 0, 255);

一般に

  memset(members, 0, sizeof members);

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

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

ポインタ値しかない場合、nMembersは配列内の要素の数です。


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


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


6
+ 1-すべての配列要素が既知の状態にあることを保証するので、これを選択します。
ChrisBD 2009年

ただし、ループを使用しないという(壮大な)要件に反します。
Michael Foukarakis 2009年

1
memsetはおそらく再帰として実装されていませんが、実装されている可能性があります。どちらの場合も、反復は適切に見えないように隠されています。これは表面的な要件でした。
スティーブギルハム

36

「空」の意味によって異なります。

members[0] = '\0';

3
これは、members [0]の値のみを変更し、members [1]からmembers [254]までは変更しません。順次アクセスしている場合は問題ありませんが、それ以外の場合はそれほど問題ありません。
Thomas Owens

3
OPの編集後、strcat()がNULLバイトを見つけてそれに応じて処理するため、私のソリューションは彼の要件に対して機能するはずです。
フェリックス

3
より良い解決策ではありません。別の問題に対する単なる解決策。
ypnos 2009年

4
Cで抽象配列を「空にする」方法はありません。すべての配列には、たとえゼロであっても、何かが含まれています。「配列を空にする」という概念は、配列の内容の高レベルの論理的解釈にのみ適用できます。たとえば、配列の内容はC文字列として解釈される場合があります。その場合、「空にする」ための適切な方法は、最初の要素を「\ 0」に設定することです。まさにフェリックスがしたこと。OPが他にどのような解釈を考えているのかはわかりませんが、具体的に説明しないと、「memset」を使用したすべての試みは、意味のない質問に対する意味のない答えにすぎません。
AnT 2009年

1
@tinkertim:ここにはNULLはありません。いいえ、「strcat」はNULLの処理方法を知りません。NULLを渡すとクラッシュします。
AnT 2009年

9

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

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

strcpy(members, "hello");

連結(文字列を追加):

strcat(members, " world");

空の文字列:

members[0] = 0;

そのように単純です。


8

charメンバー[255] = {0};


1
いいえ、初期化後に実行する必要があることを指定しなかったためです。特に、これは編集前の彼の最初の例で理解されている可能性があります。また、配列をクリアすることも非常に一般的な使用例であるためです。
user44556 2009年

彼があなたに与えた補償として+2をあなたに与える-1:P:D
stviper 2014

5

編集:質問に対する最新の編集を考えると、null終端がないため、これは機能しなくなります-配列を印刷しようとすると、文字の後に人間が読めない文字がいくつか表示されます。ただし、この回答は後世のためのコミュニティwikiとしてここに残しておきます。

char members[255] = { 0 };

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

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

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


「空」をどのように定義するかによって異なります。値が0のcharは人間が読める文字ではなく、charの配列は既知の状態です。私はそれを空だと思います。また、memsetとまったく同じことを行います(memsetの記憶が正しければ、Cを使用してから長すぎます)。
Thomas Owens

3

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

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


3
members[0] = 0;

要件を考えると、十分です。

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


1
* members = 0と書くこともできます。
eyalm 2009年

でも0有効な文字です。membersC文字列として扱われるかどうかはわかりません。
Sany


2

私は一緒に行きます

members_in_use = 0;

OPはC配列の一部ではない操作(空にする)を要求しているため、実際には非常に理にかなっています-したがって、理想的には、彼は新しいデータ構造を実装し、構造を通知するpmgの方法は空です十分です。
Michael Foukarakis 2009年

いいえ、それは本当に意味がありません。

キノピコ:どうやらあなたはその時のアプローチを理解していないようです
クリスチャン

キノピコ:コメントで説明できるよりも私の推論を説明しているので、スターブルーの答えを読んでください(ありがとうスターブルー)
pmg 2009年

うーん、これは興味深いアプローチですが、members_in_useは引き続き配列になりますか?後でできますか; member_in_use [5] =値?これはmemset(members_in_use、0、255);と同等ですか?スティーブが言ったように?もしそうなら、なぜ他の代わりに一方を使用するのですか?

1

「配列を空にする」とは、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);  

bzeroとmemset(通常)は両方ともループを使用します。
Michael Foukarakis 2009年

1

単純な方が良い-意味がありますか?

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


0

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

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

members[0] = 0;

「空にする」が「使用しているメモリを解放する」ことを意味する場合、そもそも固定文字配列を使用しないでください。むしろ、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");

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.