2011-04-27 66 views
1

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

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

任何想法用一个简洁的方式来检查它迭代遍历字符串的每个字符?

回答

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变量,这使得解决方案,如康拉德的find_first_not_of更加高效,便捷。

*感谢Steve对某些非ASCII字符串内容平台上的评论和评论。 http://msdn.microsoft.com/en-us/library/ms245348.aspx

+0

在使用':: isspace'函数之前将'char'转换为无符号类型。 – 2011-04-27 10:43:40

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风格的字符数组。

+0

'\ n'也是一个空格。 – Donotalo 2011-04-27 10:08:31

+0

'\ v'也是一个空格。 – 2011-04-27 10:16:25

+0

@Martin根据语言环境,是的。我应该明确指出,这只是一个概念证明。 – 2011-04-27 10:19:14

2

如果您想知道某个字符串中的某个字符是否具有特定的值,并且您想知道该字符串中的所有字符,您需要需要来迭代该字符串。没办法。即使memcmp在字符串上循环,它只是隐藏起来。
编辑:想我会提供一个简单的实施可变长度字符串:

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

当然,对于空终止字符串这只是工作,但应该是一个给定的。

+0

认为可能是这种情况,谢谢 – matt 2011-04-27 10:10:21

+0

@matt:为可变长度字符串添加了一个简单示例。 – Xeo 2011-04-27 10:28:08