我有一个函数,它需要一个可变长度和长度的char *。 我想检查它的内容是否都是空格。可变长度字符串内容的非递归检查
这是一个可变长度的,意味着我不能使用memcmp,因为我不知道过了多久,使第二个参数。
任何想法用一个简洁的方式来检查它迭代遍历字符串的每个字符?
我有一个函数,它需要一个可变长度和长度的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
变量,这使得解决方案,如康拉德的find_first_not_of
更加高效,便捷。
*感谢Steve对某些非ASCII字符串内容平台上的评论和评论。 http://msdn.microsoft.com/en-us/library/ms245348.aspx。
刚刚走过去的字符和检查的空格(例如,使用isspace
功能)。
或者,将char*
转换为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
方法。
在这两种情况下,使用C++ memcmp
反正是不明智的,你一般应更喜欢C++字符串C风格的字符数组。
'\ n'也是一个空格。 – Donotalo 2011-04-27 10:08:31
'\ v'也是一个空格。 – 2011-04-27 10:16:25
@Martin根据语言环境,是的。我应该明确指出,这只是一个概念证明。 – 2011-04-27 10:19:14
如果您想知道某个字符串中的某个字符是否具有特定的值,并且您想知道该字符串中的所有字符,您需要需要来迭代该字符串。没办法。即使memcmp
在字符串上循环,它只是隐藏起来。
编辑:想我会提供一个简单的实施可变长度字符串:
bool is_only_space(const char* str){
while(*str != '\0'){
if(*str != ' ')
return false;
++str;
}
return true;
}
当然,对于空终止字符串这只是工作,但应该是一个给定的。
在使用':: isspace'函数之前将'char'转换为无符号类型。 – 2011-04-27 10:43:40