1

好的,我在 StackOverflow 上搜索了如何检查字符串是空的还是空格。但是,它只适用于 ANSI 字符串。我怎样才能让它与 a 一起工作wstring

这是代码:

#include <string>
using namespace std;

//! Checks if a string is empty or is whitespace.
bool IsEmptyOrSpace(const string& str) {
    string::const_iterator it = str.begin();

    do {
        if (it == str.end())
            return true;
    } while (*it >= 0 && *it <= 0x7f && isspace(*(it++)));
    // One of these conditions will be optimized away by the compiler.
    // Which one depends on whether the characters are signed or not.

    return false;
}

我的第一个想法是更改isspace(*(it++))iswspace(*(it++)),但之前的两个条件仅适用于 ASCII,对吗?到目前为止,这是我尝试将函数调整为wstring's 的内容:

bool IsEmptyOrSpaceW(const wstring& str) {
    String::const_iterator it = str.begin();

    do {
        if (it == str.end())
            return true;
    } while (*it >= 0 && *it <= 0x7f && iswspace(*(it++)));
    // One of these conditions will be optimized away by the compiler.
    // Which one depends on whether the characters are signed or not.

        // Do I need to change "*it >= 0 && *it <= 0x7f" to something else?

    return false;
}

我的方法接近正确吗?无论哪种方式,我怎样才能实现这个IsEmptyOrSpace()函数的 Unicode 版本?

编辑: 好的,如果您需要知道为什么要进行*it >= 0 && *it <= 0x7f测试,我不能告诉您,因为我不知道。我从这个问题的答案中得到了函数的代码:C++ 检查字符串是空格还是空 所以让我从头开始,一般来说,我如何检查 awstring是空的还是只是空格?

4

2 回答 2

4

但是之前的两个条件只适用于 ASCII,对吧?

这是正确的。他们确保该值符合以下前提条件isspace:参数“必须具有 anunsigned char或 EOF 的值”。严格来说,你只需要检查,如果是无符号的*it >= 0,应该优化掉;char或者,如评论中所述,您可以将值转换为unsigned.

iswspace没有这样的先决条件,所以只需从宽版本中删除这些检查:

bool IsEmptyOrSpaceW(const wstring& str) {
    wstring::const_iterator it = str.begin();

    do {
        if (it == str.end())
            return true;
    } while (iswspace(*(it++)));

    return false;
}

就风格而言,没有必要添加一个奇怪的疣W来指示参数类型,因为您可以IsEmptyOrSpace使用不同的参数类型进行重载。

于 2012-11-14T12:04:04.120 回答
0
bool IsEmptyOrSpaceW(const wstring& str) {
  return str.length() == (size_t)std::count(str.begin(), str.end(), L' ');
}

或者

// this code works for string and wstring
    template <typename CharType>
    bool IsEmptyOrSpace(const std::basic_string<CharType>& str)  {
      return str.length() == (size_t)std::count(str.begin(), str.end(), CharType(32));
    }

实际上,还有其他类型的空白,例如制表符,我不确定这段代码是否处理这些空白字符。

如果我们想处理所有这些空白字符,我们可以找到 isspace 函数返回 false 的第一个符号

template <typename CharType>
bool IsEmptyOrSpace(const std::basic_string<CharType>& str)  {
  return str.end() == std::find_if(str.begin(), str.end(), 
          std::not1(std::ptr_fun((int(*)(int))isspace)));
}
于 2012-11-14T12:24:34.983 回答