非递归检查可变长度字符串内容

时间:2011-04-27 10:02:27

标签: c++ memcmp

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

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

关于以一种巧妙的方式检查它的想法,而不是遍历字符串的每个字符?

3 个答案:

答案 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