C++ 如何判断LPCWSTR文本是否为数字?

C++ 如何判断LPCWSTR文本是否为数字?,c++,C++,整个字符串需要由整数组成,如我们所知,它们是0123456789。我正在尝试使用以下函数,但它似乎不起作用 bool isNumeric( const char* pszInput, int nNumberBase ) { string base = "0123456789"; string input = pszInput; return (::strspn(input.substr(0, nNumberBase).c_str(), base.c_str()) ==

整个字符串需要由整数组成,如我们所知,它们是0123456789。我正在尝试使用以下函数,但它似乎不起作用

bool isNumeric( const char* pszInput, int nNumberBase )
{
    string base = "0123456789";
    string input = pszInput;

    return (::strspn(input.substr(0, nNumberBase).c_str(), base.c_str()) == input.length());

}
在代码中使用它的示例

isdigit = (isNumeric((char*)text, 11));

即使字符串中有文本,它也会返回true

可能问题在于
text
实际上是
LPCWSTR
,即
const wchar\u t*
。我们必须从题目和你的演员阵容中推断出这个事实

现在,演员阵容是个问题。编译器反对您传递
文本
。它说
text
不是
const char*
。通过强制转换,您没有更改
文本
的内容,您只是对编译器撒了谎。于是,编辑者进行了报复

接下来要做的是将宽字符缓冲区重新解释为窄8位缓冲区。如果您的宽字符缓冲区具有拉丁文本,编码为UTF-16,则每隔一个字节将为零。因此,您所做的重新解释转换会导致
isNumeric
认为字符串只有1个字符长

您需要做的是:

  • isNumeric
    中开始使用UTF-16编码的
    wchar\u t
    缓冲区
  • 在调用
    isNumeric
    之前,将UTF-16转换为ANSI
  • 你应该仔细考虑这个问题。现在看来,你的程序中有一个相当邪恶的ANSI和UTF-16的混合体。你真的应该选择一种标准的字符编码方式,并在整个过程中始终如一地使用它。这在程序内部是成立的,但您将遇到可能使用不同编码的外部文本。通过在程序和外部世界之间的边界转换来处理这个问题


    就我个人而言,我完全不明白为什么要使用C字符串。当然,您应该使用
    std::wstring
    std::string

    什么是
    test
    ,为什么要将其强制转换为
    char*
    ?您可以使用来检查这一点。
    nNumberBase
    是一个相当误导性的名称。在我看来,你并不是在使用基数为11的数字。@Joachim Pileborg谢谢!这使我找到了解决方案我回滚了编辑。如果你想回答你自己的问题,你可以这样做。你的回答让我头疼,但很高兴知道会发生什么。经过思考,我的项目最好的方法是2。在调用isNumeric之前,将UTF-16转换为ANSI。你能用代码写下你将如何做到这一点吗?