c++ - MFC新手: how to determine if a character is hexadecimal using "FindOneOf()"

标签 c++ mfc std

我是 MFC 的新手,我需要做一些听起来非常简单的事情:确定一个字符串是否只包含十六进制字符。

为此,我浏览了字符串(它是一个 CString )并使用 FindOneOf() 方法验证所有字符,如下所示:

int iTest = CString(pszText[i]).FindOneOf((LPCWSTR)"0123456789ABCDEFabcdef");

由于某些奇怪的原因,我总是得到 -1 作为结果。

我做错了什么?

P.s.1 我不喜欢使用 SpanIncluding() 方法,我发现 FindOneOf() 非常可读,但我不知道如何使用它。
P.s.2 同样简单的 STL 似乎不起作用:我尝试使用 std::isxdigit(pszText[i]) 但为了让它工作,我需要包含 <locale> 然后这个函数要求第二个参数,在我要检查的字符旁边,并且那里不允许使用 null 指针( std::isxdigit(pszText[i], nullptr) 不起作用)。

最佳答案

你的代码有几个问题:

这是错误的:

int iTest = CString(pszText[i]).FindOneOf(LPCWSTR)"0123456789ABCDEFabcdef"); 

应该是:

int iTest = CString(pszText[i]).FindOneOf(L"0123456789ABCDEFabcdef");

转换只会让编译器相信 "0123..." 是一个宽字符串,但事实并非如此。需要使用L前缀来表示该字符串是宽字符串。

但即便如此,您的算法也无法正常工作,因为 FindOneOf 只会查找参数中任何字符的第一次出现。

例子:

int iTest = CString(L"Z223Zbc").FindOneOf(L"0123456789ABCDEFabcdef");

"Z223Zbc" 显然不是十六进制字符串,但 iTest 将包含 1,因为 "Z223Zbc" 的第一个字符是"0123456789ABCDEFabcdef"'2' 并且在位置 1。

iTest 仅在要测试的字符串不包含 任何 十六进制字符(例如 "xyz")时才包含 -1。

因此这个解决方案是合适的:

  #include <cwctype>
  ...
  WCHAR string[] = L"123abcX";
  bool ishexstring = true;    // assume the string is a hex string
  for (int i = 0; ; i++)
  {
    WCHAR c = string[i];
    if (c == 0)
      break;                  // end of string => we exit the looop
    if (!std::iswxdigit(c))
    {
      ishexstring = false;    // c is no hex digit
      break;                  // exit loop
    }
  }

这个算法应该放在一个函数中,但我把它留给读者作为练习。

使用 SpanIncluding 的解决方案(效率较低,因为我们需要构造一个临时的 CString):

bool ishexstring = CString(string).SpanIncluding(L"0123456789ABCDEFabcdef") == str;

关于c++ - MFC新手: how to determine if a character is hexadecimal using "FindOneOf()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45500793/

相关文章:

mfc - MFC对话框应用程序的布局管理器

mfc - 如何禁用 MFC 链接控件的默认行为?

c++ - 不使用 Visual C++ 编译 c++ Visual C++ 7.1 解决方案

c++ - 编译python3.2 C模块,链接器要求 'python26.lib'

c++ - 在 Visual Studio 2005 中基于命令行作为 GUI 应用程序或控制台应用程序启动的可执行文件

c++ - std::copy 钩子(Hook)

c++ - std::partition 调用两次以进行快速排序

c++ - std::any_cast 不需要原始对象的类型

c++ - 为什么编译器会提示对齐?

c++ - DoModal() 定位对话框在第二个监视器的最右边