2012-05-30 41 views
0

我有一個函數可以查找字符串中目錄的最後一位。例如: 「C:\ Lolcats \ pie \ ambulance \」應該返回「救護車」。然而,它會返回一些從未見過的奇怪字符,如男性箭頭符號和其他一些奇怪的東西。如何返回目錄的末尾

string App::getlastName(string cakes){ 
    //finds the name of the last folder in a directory 
    string name; 
    string temp;//popback all of temp into name to invert it 
    cakes.pop_back(); 
    char i = cakes[cakes.length()-1]; 
    while (i != '\\'){ 
     temp.push_back(cakes[i]); 
     cakes.pop_back(); 
     i = cakes[cakes.length()-1]; 
    }       //-1? 
    for (int j = 0; j<temp.length(); ++j){ 
     name.push_back(temp.back()); 
     temp.pop_back(); 
    } 
    return name; 
} 

這大概是我曾經寫過的最糟糕的功能之一,但我想不出怎麼回事纏鬥到底關閉:(有人可以幫我嗎?d

注該功能犯規需要找到一個文件的名稱,它會僅僅是文件夾

+0

爲什麼不使用'basename',無論是從標準C庫還是從boost :: filesystem? –

+0

或友好的正則表達式?我的意思是,即使是一連串的substr調用都會比這更好。 –

+2

'temp.push_back(cakes [i]);'是你的大錯。我是你的字符串中的一個字符,而不是你的字符串的索引。 –

回答

2

如果您刪除尾部\ off字符串,您可以使用rfind和substr的簡單組合來獲取所需的數據。

string substring = cakes.substr(cakes.rfind("\\") + 1); 
+0

美麗:3我用: cakes = cakes.substr(cakes.rfind(「\\」)+ 1); 最後彈出回斜槓。歡呼的人:3 – Magicaxis

4

兩個步驟:

  • 如果它與一個反斜槓字符結束其刪除:

    if (!cakes.empty() && '\\' == *(cakes.end() - 1)) 
    { 
        cakes.erase(cakes.end() - 1); 
    } 
    
  • 使用std::string::find_last_of()找到最後一個反斜槓和std::string::substr()提取最後一部分:

    std::string last_part; 
    const size_t slash_idx = cakes.find_last_of("\\"); 
    if (std::string::npos != slash_idx) 
    { 
        last_part = cakes.substr(slash_idx + 1); 
    } 
    

如果有可能的是,目錄名稱可以包含正斜槓添加額外的檢查最後字符,並將其添加到參數find_last_of("\\/"),因爲它可以搜索多個字符。

+0

+1,但他似乎使用了反斜槓。 – smerlin

0

你的方法依賴於字符串已經在正確的格式,沒有斷言或錯誤檢查 - 不是一個好主意。

我只想做這樣的事情:

char* directoryName = strrchr(fullPath, '\\') + 1; 

你修剪掉後尾隨 '\'。

+0

不要擔心字符串格式,我有其他地方處理:3 – Magicaxis

0

@Joel龍多的評論,他說,該行temp.push_back(cakes[i])一個問題是正確的,但我想我會詳細說明。

原因是變量i被定義爲char而不是int,但它可能是隱式強制轉換的。因此,返回奇怪字符的原因是因爲將char投射到int導致索引值可能不存在於您的字符串中。

讀取你的代碼示例,它看起來像你應該做的temp.push_back(cakes[cakes.length()-1])而不是(或更好的,將此索引存儲在一個臨時變量,所以你不必每次都寫)。

相關問題