【问题标题】:How to remove first 2 characters in a string if it has a '-'如果字符串中有'-',如何删除字符串中的前2个字符
【发布时间】:2020-10-15 02:55:11
【问题描述】:

p_officialTitle 在这种情况下通常等于"1-Application""Application"。如果它有一个破折号,它必须被删除,它之前的数字也需要被删除。 MidFind 方法不起作用。还有其他推荐吗?

DIIXDAPI_INDEX_FIELD_TYPE* p_OfficialTitle = Find(param->documentIndexFieldList, D_OFFICIAL_TITLE);
                    
//Name a Temporary CString; in that CString remove anything with a '-' --- This cleans up the naming convention
    
CString strTemp = p_OfficialTitle->szFieldValue.Get();
    
p_OfficialTitle->szFieldValue.Set(strTemp.Mid(strTemp.Find(_T('-'))));

【问题讨论】:

  • 我们不知道MidFind 这些函数实际上做了什么,因为我们不知道CString 的类
  • @cdhowie 然后请添加相关标签(我不知道是MFC还是ATL或两者兼而有之)。我不熟悉这些,并试图回答看到 c++ 标签
  • @Baruch 这不是我的问题,你为什么对我大喊大叫?
  • @cdhowie(请仔细阅读此评论)我不会对任何人大喊大叫。我要求进行更正,因为我没有资格自己做。由于您似乎有资格成功,因此我在评论中标记了您(无论如何,OP都会收到有关cmets的通知)

标签: c++ mfc atl


【解决方案1】:

CString::Find() 返回一个从 0 开始的索引,如果找不到字符/子字符串,则返回 -1

CString::Mid() 返回从指定索引开始的子字符串。

Find() 返回-1 时,您没有处理这种情况,例如"Application"。您不能将-1 作为起始索引传递给Mid(),因此您需要检查该条件。并且由于您要删除直到 并包括 - 的所有内容(如果找到),您需要将其索引 +1 传递给 Mid(),例如:

CString strTemp = p_OfficialTitle->szFieldValue.Get();
    
int index = strTemp.Find(_T('-'));
if (index != -1) { // szFieldValue.Set(strTemp.Mid(index+1)); // 

或者,您可以简单地摆脱if(如果您不介意在未找到- 时调用多余的Set()),例如:

CString strTemp = p_OfficialTitle->szFieldValue.Get();

p_OfficialTitle->szFieldValue.Set(strTemp.Mid(strTemp.Find(_T('-'))+1));

由于Find('-') + 1 对于"Application"0,对于"1-Application"2,所以如果- 未找到,Mid(0) 将返回整个字符串,而Mid(2) 将只返回如果找到-,则剩余字符。

【讨论】:

  • 嘿,成功了!感谢您的帮助和如此彻底!
猜你喜欢
  • 2011-11-03
  • 2023-04-09
  • 2022-11-23
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多