题
我有一个函数,该函数具有可变长度和长度的char*。我想检查其内容是否都是白色空间。
它是可变长度,这意味着我不能使用MEMCMP,因为我不知道要制作第二个参数多长时间。
关于整洁的方法,是否有任何想法在弦上进行迭代检查吗?
解决方案
回答此确切要求的合理有效方法是:
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
更有效和方便。
*感谢史蒂夫(Steve)在某些具有非ASCII字符串内容的平台上的评论。 http://msdn.microsoft.com/en-us/library/ms245348.aspx.
其他提示
只需走过字符并检查空格(例如,使用 isspace
功能)。
或者,转换 char*
到 std::string
并使用字符串功能,即 find_first_not_of
. 。例如,使用前否编码中使用“常规”空格字符:
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;
}
当然,这仅适用于无终止的字符串,但这应该是给定的。
不隶属于 StackOverflow