我是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)
不起作用)。
答案 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