C++ 可变长度字符串内容的非递归检查
我有一个函数,它接受长度可变的字符*和长度。 我想检查它的内容是否都是空白 它是一个可变长度,这意味着我不能使用memcmp,因为我不知道第二个参数需要多长时间C++ 可变长度字符串内容的非递归检查,c++,memcmp,C++,Memcmp,我有一个函数,它接受长度可变的字符*和长度。 我想检查它的内容是否都是空白 它是一个可变长度,这意味着我不能使用memcmp,因为我不知道第二个参数需要多长时间 有没有想过一种不迭代字符串中每个字符的简洁方法?只需遍历字符并检查空格(例如,使用函数) 或者,将char*转换为std::string并使用字符串函数,即。例如,在Unicode之前的编码中使用“常规”空白字符: bool is_all_spaces(char const* text, unsigned len) { stri
有没有想过一种不迭代字符串中每个字符的简洁方法?只需遍历字符并检查空格(例如,使用函数) 或者,将
char*
转换为std::string
并使用字符串函数,即。例如,在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\u first\u not\u的方法
无论是哪种情况,在C++中使用<代码> MMECMP <代码>都是不明智的,你通常应该更喜欢C++字符串到C样式char数组。
只需遍历字符并检查空白(例如使用函数)。
或者,将
char*
转换为std::string
并使用字符串函数,即。例如,在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\u first\u not\u的方法
无论是哪种情况,在C++中使用<代码> MMECMP <代码>都是不明智的,你通常应该更喜欢C++字符串到C样式char数组。
如果你想知道字符串中某个字符是否有一定的值,并且你想知道对于字符串中的所有字符,你需要迭代字符串。没办法。即使memcmp
在字符串上循环,它也对您隐藏。
编辑:我想为可变长度字符串提供一个简单的实现:
bool is_only_space(const char* str){
while(*str != '\0'){
if(*str != ' ')
return false;
++str;
}
return true;
}
当然,这只适用于以null结尾的字符串,但这应该是给定的。如果您想知道字符串中的某个字符是否具有某个值,并且您想知道,对于字符串中的所有字符,您需要迭代该字符串。没办法。即使memcmp
在字符串上循环,它也对您隐藏。
编辑:我想为可变长度字符串提供一个简单的实现:
bool is_only_space(const char* str){
while(*str != '\0'){
if(*str != ' ')
return false;
++str;
}
return true;
}
当然,这只适用于以null结尾的字符串,但这应该是给定的。回答这一确切要求的合理有效方法是:
bool is_whitespace(const char* p, size_t n)
{
while (n--)
if (!isspace(static_cast<unsigned char>(*p++)))
return false;
return true;
}
bool是空白(const char*p,size\t n)
{
而(n--)
如果(!isspace(静态_转换(*p++)))
返回false;
返回true;
}
更一般地说,尝试将此类数据存储在std::string
变量中是一个好主意,这使得像Konrad的find_first_而不是
这样的解决方案更加高效和方便
*感谢Steve在一些具有非ASCII字符串内容的平台上对isspace的评论。。。e、 g.回答这一确切要求的合理有效方法是:
bool is_whitespace(const char* p, size_t n)
{
while (n--)
if (!isspace(static_cast<unsigned char>(*p++)))
return false;
return true;
}
bool是空白(const char*p,size\t n)
{
而(n--)
如果(!isspace(静态_转换(*p++)))
返回false;
返回true;
}
更一般地说,尝试将此类数据存储在std::string
变量中是一个好主意,这使得像Konrad的find_first_而不是
这样的解决方案更加高效和方便
*感谢Steve在一些具有非ASCII字符串内容的平台上对isspace的评论。。。e、 g..@Martin取决于区域设置,是的。我应该说清楚,这只是一个概念的证明。@Martin,这取决于地区,是的。我应该说清楚这只是一个概念证明。@马特:添加了一个变长字符串的简单示例。@马特:添加了一个变长字符串的简单示例。在使用:isspace
函数之前将char
转换为无符号类型。在使用::isspace
函数。