0

文字列内のディレクトリの最後のビットを見つけることになっている関数があります。例:「C:\ Lolcats \ pie \ambulance\」は「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;
}

これはおそらく私が今まで書いた中で最悪の関数の1つですが、他にどのように終わりを解決するかを考えることはできません:(誰かが私を助けてくれますか?:D

関数はファイルの名前を見つける必要はなく、単にフォルダーになることに注意してください。

4

4 に答える 4

4

2つのステップ:

  • バックスラッシュ文字で終わっている場合は、それを削除します。

    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("\\/")です。複数の文字を検索できるためです。

于 2012-05-30T13:41:30.750 に答える
2

文字列の末尾の\を削除すると、rfindとsubstrの単純な組み合わせを使用して、必要なデータを取得できます。

string substring = cakes.substr(cakes.rfind("\\") + 1);
于 2012-05-30T13:45:30.000 に答える
0

@Joel Rondeauのコメントで、線temp.push_back(cakes[i])が問題だと言っているのは正しいですが、詳しく説明したいと思いました。

その理由は、変数がではなくiとして定義されているためですが、2つが暗黙的にキャストされる可能性があります。したがって、奇妙な文字が返される理由は、をにキャストすると、文字列におそらく存在しないインデックス値が生成されたためです。charintcharint

コードサンプルを読み取ると、temp.push_back(cakes[cakes.length()-1])代わりに実行する必要があるように見えます(または、このインデックスを一時変数に格納して、毎回書き込みを続ける必要がないようにすることをお勧めします)。

于 2012-05-30T13:48:57.457 に答える
0

あなたの方法は、アサーションやエラーチェックのない正しい形式になっている文字列に依存します-良い考えではありません。

私は次のようなことをします:

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

末尾の「\」を削除した後。

于 2012-05-30T13:43:22.297 に答える