我有一个函数,它采用可变长度和长度的char *。 我想检查它的内容是否都是空格。
它是一个可变长度,意味着我无法使用memcmp,因为我不知道制作第二个参数需要多长时间。
关于以一种巧妙的方式检查它的想法,而不是遍历字符串的每个字符?
答案 0 :(得分:4)
只需遍历字符并检查空格(例如使用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风格的字符数组。
答案 1 :(得分:2)
如果您想知道字符串中的某个字符是否具有某个值,并且您想知道字符串中的所有字符,则需要来迭代字符串。没办法解决这个问题。即使memcmp
在字符串上循环,它也只是对你隐藏
编辑:以为我会为可变长度字符串提供一个简单的实现:
bool is_only_space(const char* str){
while(*str != '\0'){
if(*str != ' ')
return false;
++str;
}
return true;
}
当然,这只适用于以null结尾的字符串,但这应该是给定的。
答案 2 :(得分:2)
回答这个确切要求的一种合理有效的方法是:
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