可変長と長さのchar*をとる関数があります。内容がすべて空白かどうかを確認したい。
これは可変長であるため、2番目のパラメーターを作成する期間がわからないため、memcmpを使用できません。
文字列の各文字を繰り返さずにチェックするためのきちんとした方法について何か考えはありますか?
文字の上を歩き、空白を確認するだけです(isspace
関数を使用するなど)。
char*
または、をaに変換し、std::string
文字列関数、つまりを使用しますfind_first_not_of
。たとえば、Unicode以前のエンコーディングで「従来の」空白文字を使用すると、次のようになります。
bool is_all_spaces(char const* text, unsigned len) {
string str(text, len);
return str.find_first_not_of(" \t\r\n\v\f") == string::npos;
}
より派手な空白認識は、任意のテキストエンコーディング/ロケールに対応します。そのため、isspace
おそらく使用する方がfind_first_not_of
アプローチよりも優れています。
いずれの場合も、memcmp
C ++で使用することはお勧めできません。通常、Cスタイルのchar配列よりもC++文字列を使用することをお勧めします。
文字列内の特定の文字が特定の値であるかどうかを知りたい場合、および文字列内のすべての文字について知りたい場合は、文字列を反復処理する必要があります。それを回避する方法はありません。文字列をループしてもmemcmp
、それはあなたから隠されているだけです。
編集:可変長文字列の簡単な実装を提供すると思いました:
bool is_only_space(const char* str){
while(*str != '\0'){
if(*str != ' ')
return false;
++str;
}
return true;
}
もちろん、これはnullで終了する文字列に対してのみ機能しますが、それは当然のことです。
この正確な要件に答える合理的に効率的な方法は次のとおりです。
bool is_whitespace(const char* p, size_t n)
{
while (n--)
if (!isspace(static_cast<unsigned char>(*p++)))
return false;
return true;
}
より一般的には、このようなデータをstd::string
変数に格納することをお勧めします。これにより、Konradのようなソリューションがfind_first_not_of
より効率的で便利になります。
*非ASCII文字列コンテンツを含む一部のプラットフォームでのコメントreisspaceについてSteveに感謝します...例: http: //msdn.microsoft.com/en-us/library/ms245348.aspx。