如果您對Python一無所知,我表示歉意,但是,下面的代碼段對任何人都應該是非常易讀的。唯一值得注意的技巧 - 使用[-1]
爲列表編制索引,如果有最後一個元素,則會提供給您最後一個元素,或引發異常。幫我翻譯替換文件名中的擴展名的Python代碼到C++
>>> fileName = 'TheFileName.Something.xMl'
>>> fileNameList = fileName.split('.')
>>> assert(len(fileNameList) > 1) # Must have at least one period in it
>>> assert(fileNameList[-1].lower() == 'xml')
>>> fileNameList[-1] = 'bak'
>>> fileName = '.'.join(fileNameList)
>>> print(fileName)
TheFileName.Something.bak
我需要這個邏輯轉換成C++(我實際使用的語言,但到目前爲止,吮吸)具有以下簽名功能:void PopulateBackupFileNameOrDie(CAtlString& strBackupFileName, CAtlString& strXmlFileName);
。這裏strXmlFileName
是「輸入」,strBackupFileName
是「輸出」(我是否應該顛倒兩者的操作符?)。棘手的部分是(糾正我,如果我錯了)我正在處理一個Unicode字符串,所以尋找這些字符:.xmlXML
是不是很直截了當。最新的Python沒有這些問題,因爲'.'
和"."
都是長度爲1的Unicode字符串(不是"char"
類型),都包含一個點。
請注意,返回類型爲void
- 不必太擔心。我不想讓你知道我們如何將錯誤傳達給用戶。在我的Python例子中,我只使用了一個斷言。你可以做這樣的事情,或只是包括一個評論,如// ERROR: [REASON]
。
請問是否有不清楚的地方。建議使用std::string
等而不是CAtlString
作爲函數參數,這不是我正在尋找的。如果你需要,你可以在函數內部轉換它們,但是我不希望在一個函數中混合不同的字符串類型。我正在使用VS2010在Windows上編譯這個C++。這意味着我不會安裝BOOST
,QTString
或其他無法使用的庫。偷一個boost
或其他標題來啓用一些魔法也不是正確的解決方案。
謝謝。
誰投了我票 - 請告訴我爲什麼我的問題是愚蠢的。 – 2010-07-09 22:30:10
我沒有投票給你,但他們可能做到了,因爲你要求其他人只是做你的工作,而不是給你一個提示。 – 2010-07-10 00:34:42
看起來我只是可能不得不在這一個懸賞。 – 2010-07-10 02:01:01