Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变长度字符串内容的非递归检查_C++_Memcmp - Fatal编程技术网

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

C++ 可变长度字符串内容的非递归检查,c++,memcmp,C++,Memcmp,我有一个函数,它接受长度可变的字符*和长度。 我想检查它的内容是否都是空白 它是一个可变长度,这意味着我不能使用memcmp,因为我不知道第二个参数需要多长时间 有没有想过一种不迭代字符串中每个字符的简洁方法?只需遍历字符并检查空格(例如,使用函数) 或者,将char*转换为std::string并使用字符串函数,即。例如,在Unicode之前的编码中使用“常规”空白字符: bool is_all_spaces(char const* text, unsigned len) { stri

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

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


有没有想过一种不迭代字符串中每个字符的简洁方法?

只需遍历字符并检查空格(例如,使用函数)

或者,将
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
函数。