C++ 如何仅删除非数字字符串的第一个字符?(MFC,C+;+;)
我只想删除字符串中不是数字的第一个字符。第一个字符可以是从“A”到“Z”的任何字符,也可以是像“&”或“#”这样的特殊字符。这段遗留代码是用MFC编写的。我看过CString类,但不知道如何使其工作 我的字符串可能类似于以下任意一种: J22008943452GF或22008943452GF或K34233333IF或23000526987IF或#12000895236GF。你现在明白了 我的困境是我需要删除所有字符串中第一个位置的字符,而不是以数字开头的字符串。对于以数字开头的字符串,我需要将它们放在一边。此外,字符串中的任何其他字符都不应更改。例如,不应更改字符串后面部分的“G”、“I”或“F”。字符串的长度将始终为13或14位 这是我到目前为止所拥有的C++ 如何仅删除非数字字符串的第一个字符?(MFC,C+;+;),c++,mfc,C++,Mfc,我只想删除字符串中不是数字的第一个字符。第一个字符可以是从“A”到“Z”的任何字符,也可以是像“&”或“#”这样的特殊字符。这段遗留代码是用MFC编写的。我看过CString类,但不知道如何使其工作 我的字符串可能类似于以下任意一种: J22008943452GF或22008943452GF或K34233333IF或23000526987IF或#12000895236GF。你现在明白了 我的困境是我需要删除所有字符串中第一个位置的字符,而不是以数字开头的字符串。对于以数字开头的字符串,我需要将它
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);
}