我有一个函数,该函数具有可变长度和长度的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 变量,使解决方案像Konrad一样 find_first_not_of 更有效和方便。

*感谢史蒂夫(Steve)在某些具有非ASCII字符串内容的平台上的评论。 http://msdn.microsoft.com/en-us/library/ms245348.aspx.

其他提示

只需走过字符并检查空格(例如,使用 isspace 功能)。

或者,转换 char*std::string 并使用字符串功能,即 find_first_not_of. 。例如,使用前否编码中使用“常规”空格字符:

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阵列。

如果您想知道字符串中的某个字符是否具有一定值,并且您想知道字符串中的所有字符,您 需要 在字符串上迭代。没办法解决这个问题。甚至 memcmp 在字符串上循环,它只是隐藏在您身上。
编辑: 以为我会为可变长度字符串提供简单的实现:

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

当然,这仅适用于无终止的字符串,但这应该是给定的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top