MFC新手:如何使用" FindOneOf()"

时间:2017-08-04 07:35:20

标签: c++ mfc std

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

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

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

出于某些奇怪的原因,我总是得到-1

我做错了什么?

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

1 个答案:

答案 0 :(得分:2)

您的代码中存在几个问题:

这是错误的:

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"的{​​{1}}的第一个字符是"0123456789ABCDEFabcdef",那是在第1位。

如果要测试的字符串不包含任何十六进制字符,

'2'将仅包含-1,例如iTest

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

"xyz"

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

使用 #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