Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何仅删除非数字字符串的第一个字符?(MFC,C+;+;)_C++_Mfc - Fatal编程技术网

C++ 如何仅删除非数字字符串的第一个字符?(MFC,C+;+;)

C++ 如何仅删除非数字字符串的第一个字符?(MFC,C+;+;),c++,mfc,C++,Mfc,我只想删除字符串中不是数字的第一个字符。第一个字符可以是从“A”到“Z”的任何字符,也可以是像“&”或“#”这样的特殊字符。这段遗留代码是用MFC编写的。我看过CString类,但不知道如何使其工作 我的字符串可能类似于以下任意一种: J22008943452GF或22008943452GF或K34233333IF或23000526987IF或#12000895236GF。你现在明白了 我的困境是我需要删除所有字符串中第一个位置的字符,而不是以数字开头的字符串。对于以数字开头的字符串,我需要将它

我只想删除字符串中不是数字的第一个字符。第一个字符可以是从“A”到“Z”的任何字符,也可以是像“&”或“#”这样的特殊字符。这段遗留代码是用MFC编写的。我看过CString类,但不知道如何使其工作

我的字符串可能类似于以下任意一种: J22008943452GF或22008943452GF或K34233333IF或23000526987IF或#12000895236GF。你现在明白了

我的困境是我需要删除所有字符串中第一个位置的字符,而不是以数字开头的字符串。对于以数字开头的字符串,我需要将它们放在一边。此外,字符串中的任何其他字符都不应更改。例如,不应更改字符串后面部分的“G”、“I”或“F”。字符串的长度将始终为13或14位

这是我到目前为止所拥有的

CString GAbsMeterCalibration::TrimMeterSNString (CString meterSN)
 {
   meterSN.MakeUpper();
   CString TrimmedMeterSNString = meterSN;
   int strlength = strlen(TrimmedMeterSNString);

    if (strlength == 13)
       {
         // Check the first character anyway, even though it’s
         //  probably okay.  If it is a digit, life’s good.
         //  Return unaltered TrimmedMeterSNString;
       }

    if (strlength == 14)) 
       {
           //Check the first character, it’s probably going
           //  to be wrong and is a character, not a digit.  

           // if I find a char in the first postion of the
           //    string, delete it and shift everything to the 
           //    left.  Make this my new TrimmedMeterSNString
           //  return altered TrimmedMeterSNString;
        }
 }
在调用之前检查并验证字符串长度

从我的调查中,我发现MFC没有正则表达式
班级。它也没有子字符串方法。

如何:

CString GAbsMeterCalibration::TrimMeterSNString (CString meterSN)
 {
   meterSN.MakeUpper();
   CString TrimmedMeterSNString = meterSN;
   int strlength = strlen(TrimmedMeterSNString);

    if (std::isdigit(TrimmedMeterSNString.GetAt(0)) )
       {
         // Check the first character anyway, even though it’s
         //  probably okay.  If it is a digit, life’s good.
         //  Return unaltered TrimmedMeterSNString;
       }
 }

据我所知,如果第一个字母不是数字,您希望删除它。因此,您可以简化此函数:

CString GAbsMeterCalibration::TrimMeterSNString(CString meterSN)
{
    meterSN.MakeUpper();

    int length = meterSN.GetLength();

    // just check the first character is always a digit else remove it
    if (length > 0 && unsigned(meterSN[0] - TCHAR('0')) > unsigned('9'))
    {
        return meterSN.Right(length - 1);
    }

    return meterSN;
}
我没有使用函数isdigit而不是unsigned的条件技巧,因为CString使用的TCHAR可以是char或wchar\u t。

CString test=“12355adaddfca”;

如果((test.GetAt(0)>=48)和&(test.GetAt(0)我不知道您是否尝试过这个,但是,它应该可以工作

CString str = _T("#12000895236GF");
//  check string to see if it starts with digit.
CString result = str.SpanIncluding(_T("0123456789"));
//  if result is empty, string does not start with a number
//  and we can remove the first character.  Otherwise, string
//  remains intact.
if (result.IsEmpty())
    str = str.Mid(1);

似乎比提议的要简单一些。

解决方案相当简单:

CString GAbsMeterCalibration::TrimMeterSNString(CString meterSN) {
    meterSN.MakeUpper();
    return _istdigit(meterSN.GetAt(0)) ? meterSN :
                                         meterSN.Mid(1);
}
可以使用为ANSI和Unicode项目设置编译实现。这是必需的,因为您使用的是存储MBCS或Unicode字符串的
CString
。所需的子字符串是使用提取的


(请注意,
CString
是特定的
CStringT
模板实例化的类型定义,具体取决于您的项目设置。)

“它也没有子字符串方法”-是吗?您可以使用
.Mid(1)
而不是
Right
来去除我认为的第一个字符,还有一个处理tchars的方法。应该是GetAt(0)对于第一个字符?他应该使用宽字符,所以常规的isdigit可能是不够的。我认为他的问题是修剪字符串,你已经忽略了。这不是
std::string
,而是MFC的CString,它通常包含宽字符。这是他问的“做你的事”部分。我建议永远不要这样做在代码中使用幻数?
\u T('0')
\u T('9')有什么问题
?总有一天会有人维护这段代码。另外,
GetBuffer
在这里是错误的工具。同意幻数部分…枚举在这里是合适的。不,枚举不合适,因为它们有错误的数据类型。我在之前的评论中已经提供了正确类型的建议。错误的数据但一般来说,当你使用一个显式整数值来做一个运算,比如在位集中,你想翻转一点,你可以做x.set(7)…但是enum将适合这里,对吗?
Mid
的第二个参数称为
nCount
。您试图提取的字符比可用的多。维护开发人员编写简洁的代码可能也更容易。提取您不感兴趣的字符范围几乎没有帮助。只需im如果第一个字符是数字,请检查它是否是您想要执行的检查。@I非常感谢您的提示。我已经更新了我的答案。但是,我将恭敬地不同意您的意见。spaninclude不是要提取字符串,而是要告诉您第一个字符是否是数字。只是另一个way、 虽然,不是你想要的,但要完成这项任务。一定要喜欢神秘的否决票!至少要提供一个理由。
CString GAbsMeterCalibration::TrimMeterSNString(CString meterSN) {
    meterSN.MakeUpper();
    return _istdigit(meterSN.GetAt(0)) ? meterSN :
                                         meterSN.Mid(1);
}