我有一个函数,它需要一个可变长度的 char* 和长度。我想检查它的内容是否都是空格。
它是一个可变长度,意味着我不能使用 memcmp,因为我不知道制作第二个参数需要多长时间。
有什么想法可以通过一种简洁的方式来检查它,而无需遍历字符串的每个字符?
只需走过字符并检查空格(例如使用isspace
函数)。
或者,将 转换char*
为 astd::string
并使用字符串函数,即find_first_not_of
. 例如,在 pre-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++ 字符串而不是 C 样式的 char 数组。
如果您想知道字符串中的某个字符是否具有某个值,并且您想知道对于字符串中的所有字符,您需要遍历该字符串。没办法。甚至memcmp
在字符串上循环,它只是对你隐藏。
编辑:以为我会为可变长度字符串提供一个简单的实现:
bool is_only_space(const char* str){
while(*str != '\0'){
if(*str != ' ')
return false;
++str;
}
return true;
}
当然,这仅适用于以空字符结尾的字符串,但这应该是给定的。
回答这个确切要求的一种相当有效的方法是:
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 字符串内容的评论 re isspace... 例如http://msdn.microsoft.com/en-us/library/ms245348.aspx。