文字配列が空かどうかを確認する最も信頼できる方法はどれですか?
char text[50];
if(strlen(text) == 0) {}
または
if(text[0] == '\0') {}
または私はする必要がありますか
memset(text, 0, sizeof(text));
if(strlen(text) == 0) {}
これについて最も効率的な方法は何ですか?
このコードを考えます:
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)
テストは両方とも空の文字列を検出します。
配列がヌル終了文字列を保持しているかどうかによって異なります。もしそうなら、その後
if(text[0] == '\0') {}
十分なはずです。
編集:別の方法は...
if (strcmp(text, "") == 0)
これは潜在的に効率が劣りますが、意図を明確に表しています。
これは、文字配列が空かどうかを見つけるために機能します。また、おそらく最速です。
if(text[0] == '\0') {}
text
配列が空の場合、これも高速になります。文字が含まれている場合は、最初にすべての文字をカウントする必要があります。
if(strlen(text) == 0) {}
2番目の方法は、1回の読み取りと1回の比較を伴うため、nullで終わる文字列が空かどうかをテストする最も確実な方法です。この場合、このアプローチには間違いなく間違いがないので、使用することもできます。
3番目の方法は、文字配列が空かどうかをチェックしません。文字配列が空であることを保証します。
2番目は最速です。 strlen
を使用すると近いif文字列は空になりますが、strlen
は常に文字列のすべての文字を反復処理するため、そうであればnot空の場合、必要以上の作業を行います。
Jamesが述べたように、3番目のオプションはチェックする前に文字列を消去するため、チェックは常に成功しますが、意味がありません。
if (text[0] == '\0')
{
/* Code... */
}
フラッシュやRAMのスペースがほとんどないマイクロコントローラー用にコーディングしている場合に使用します。無駄になりますたくさん最初のバイトをチェックするよりもstrlen
を使用するより多くのフラッシュ。
上記の例は最速であり、必要な計算は少なくなります。