web-dev-qa-db-ja.com

文字配列が空かどうかを確認する最良の方法

文字配列が空かどうかを確認する最も信頼できる方法はどれですか?

char text[50];

if(strlen(text) == 0) {}

または

if(text[0] == '\0') {}

または私はする必要がありますか

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

これについて最も効率的な方法は何ですか?

59
ZPS

このコードを考えます:

char text[50];
if(strlen(text) == 0) {}

このコードに関する質問が続きます:

 memset(text, 0, sizeof(text));
 if(strlen(text) == 0) {}

混乱のにおいがする。具体的には、この場合:

char text[50];
if(strlen(text) == 0) {}

... text[]の内容は初期化されず、未定義になります。したがって、strlen(text)は未定義の結果を返します。

C文字列が空の文字列に初期化されることを保証する最も簡単で速い方法は、最初のバイトを0に設定することです。

char text[50];
text[0] = 0;

それ以降、strlen(text)と非常に高速ですが、まっすぐではない(text[0] == 0)テストは両方とも空の文字列を検出します。

71
bbum

配列がヌル終了文字列を保持しているかどうかによって異なります。もしそうなら、その後

if(text[0] == '\0') {}

十分なはずです。

編集:別の方法は...

if (strcmp(text, "") == 0)

これは潜在的に効率が劣りますが、意図を明確に表しています。

19
Parappa

これは、文字配列が空かどうかを見つけるために機能します。また、おそらく最速です。

if(text[0] == '\0') {}

text配列が空の場合、これも高速になります。文字が含まれている場合は、最初にすべての文字をカウントする必要があります。

if(strlen(text) == 0) {}
7
Peter Stuifzand

2番目の方法は、1回の読み取りと1回の比較を伴うため、nullで終わる文字列が空かどうかをテストする最も確実な方法です。この場合、このアプローチには間違いなく間違いがないので、使用することもできます。

3番目の方法は、文字配列が空かどうかをチェックしません。文字配列が空であることを保証します。

4
James McNellis

2番目は最速です。 strlenを使用すると近いif文字列は空になりますが、strlenは常に文字列のすべての文字を反復処理するため、そうであればnot空の場合、必要以上の作業を行います。

Jamesが述べたように、3番目のオプションはチェックする前に文字列を消去するため、チェックは常に成功しますが、意味がありません。

4
Graeme Perrow
if (text[0] == '\0')
{
    /* Code... */
}

フラッシュやRAMのスペースがほとんどないマイクロコントローラー用にコーディングしている場合に使用します。無駄になりますたくさん最初のバイトをチェックするよりもstrlenを使用するより多くのフラッシュ。

上記の例は最速であり、必要な計算は少なくなります。

2
Tony