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

non recursive check of variable length string content

本文关键字:递归 检查 字符串      更新时间:2023-10-16

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

它是一个可变长度,这意味着我不能使用memcmp,因为我不知道第二个参数的长度。

有没有想过一种简洁的方法来检查它,而不是遍历字符串的每个字符?

只需遍历字符并检查空白(例如使用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(" trnvf") == string::npos;
}

一个更花哨的空白识别将处理任意文本编码/区域设置。出于这个原因,使用isspace可能比find_first_not_of方法更好。

无论哪种情况,在c++中使用memcmp都是不明智的,你通常应该更喜欢c++字符串而不是C风格的字符数组。

回答这个确切要求的一种合理有效的方法是:

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字符串内容的平台上对reisspace的评论…例如http://msdn.microsoft.com/en-us/library/ms245348.aspx。

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

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

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