1

我有一个函数,它需要一个可变长度的 char* 和长度。我想检查它的内容是否都是空格。

它是一个可变长度,意味着我不能使用 memcmp,因为我不知道制作第二个参数需要多长时间。

有什么想法可以通过一种简洁的方式来检查它,而无需遍历字符串的每个字符?

4

3 回答 3

4

只需走过字符并检查空格(例如使用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 数组。

于 2011-04-27T10:04:35.240 回答
2

如果您想知道字符串中的某个字符是否具有某个值,并且您想知道对于字符串中的所有字符,您需要遍历该字符串。没办法。甚至memcmp在字符串上循环,它只是对你隐藏。
编辑:以为我会为可变长度字符串提供一个简单的实现:

bool is_only_space(const char* str){
  while(*str != '\0'){
    if(*str != ' ')
      return false;
    ++str;
  }
  return true;
}

当然,这仅适用于以空字符结尾的字符串,但这应该是给定的。

于 2011-04-27T10:05:45.500 回答
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更加高效和方便。

*感谢史蒂夫在某些平台上对非 ASCII 字符串内容的评论 re isspace... 例如http://msdn.microsoft.com/en-us/library/ms245348.aspx

于 2011-04-27T10:19:27.500 回答