установить <string>: как перечислить не строки, начиная с данной строки и заканчивая `/`? - PullRequest
0 голосов
/ 24 августа 2011

например, у нас есть в нашем наборе:

 bin/obj/Debug/CloudServerPrototype/ra.write.1.tlog 
 bin/obj/Debug/CloudServerPrototype/rc.write.1.tlog 
 bin/obj/Debug/vc100.idb 
 bin/obj/Debug/vc100.pdb 

Так вот, что я пытался на основе этого решительного ответа :

#include <iostream>
#include <algorithm>
#include <set>
#include <string>
#include <iterator>

using namespace std;

struct get_pertinent_part
{
    const std::string given_string;

    get_pertinent_part(const std::string& s)
        :given_string(s)
    {
    }

    std::string operator()(const std::string& s)
    {
        std::string::size_type first = 0;

        if (s.find(given_string) == 0)
        {
            first = given_string.length() + 1;
        }

        std::string::size_type count = std::string::npos;
        std::string::size_type pos = s.find_last_of("/");
        if (pos != std::string::npos && pos > first)
        {
            count = pos + 1 - first;
        }

        return s.substr(first, count);
    }
};

void directory_listning_without_directories_demo()
{
    set<string> output;
    set<string> demo_set;

    demo_set.insert("file1");
    demo_set.insert("file2");
    demo_set.insert("folder/file1");
    demo_set.insert("folder/file2");
    demo_set.insert("folder/folder/file1");
    demo_set.insert("folder/folder/file2");
    demo_set.insert("bin/obj/Debug/CloudServerPrototype/ra.write.1.tlog");
    demo_set.insert("bin/obj/Debug/CloudServerPrototype/rc.write.1.tlog");
    demo_set.insert("bin/obj/Debug/vc100.idb");
    demo_set.insert("bin/obj/Debug/vc100.pdb");


    std::transform(demo_set.begin(),
        demo_set.end(),
        std::inserter(output, output.end()),
        get_pertinent_part("bin/obj/Debug/"));

    std::copy(output.begin(),
        output.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));
}

int main()
{
    directory_listning_without_directories_demo();
    cin.get();
    return 0;
}

Это выводит:

CloudServerPrototype/
file1
file2
folder/
folder/folder/
vc100.idb
vc100.pdb

и нам дана строка bin/obj/Debug/.Мы хотим обратить внимание:

vc100.idb 
vc100.pdb 
CloudServerPrototype/

Как это сделать?

Ответы [ 3 ]

1 голос
/ 24 августа 2011

Непонятно, с какой частью проблемы вы застряли, поэтому вот вам стартер.

Чтобы получить части строк между «заданной строкой» и конечным символом «/» (гдеприсутствует):

std::string get_pertinent_part(const std::string& s)
{
    std::string::size_type first = 0;
    if (s.find(given_string) == 0)
    {
        first = given_string.length() + 1;
    }

    std::string::size_type count = std::string::npos;
    std::string::size_type pos = s.find_last_of("/");
    if (pos != std::string::npos && pos > first)
    {
        count = pos + 1 - first;
    }

    return s.substr(first, count);
}

Чтобы вставить эти детали в новый набор (output), чтобы гарантировать уникальность, вы можете использовать следующее:

std::transform(your_set.begin(),
               your_set.end(),
               std::inserter(output, output.end()),
               get_pertinent_part);

Возможно, вы захотите передать given_string в get_pertinent_part(), в этом случае вам необходимо преобразовать его в функтор:

struct get_pertinent_part
{
    const std::string given_string;

    get_pertinent_part(const std::string& s)
        :given_string(s)
    {
    }

    std::string operator()(const std::string& s)
    {
        std::string::size_type first = 0;

        //
        // ...same code as before...
        //

        return s.substr(first, count);
    }
};

Затем вы можете назвать его следующим образом:

std::transform(your_set.begin(),
               your_set.end(),
               std::inserter(output, output.end()),
               get_pertinent_part("bin/obj/Debug"));

Для вывода новогоset:

std::copy(output.begin(),
          output.end(),
          std::ostream_iterator<std::string>(std::cout, "\n"));

Сортировка результатов оставлена ​​в качестве упражнения.

1 голос
/ 24 августа 2011

Быстрый пример того, что вы хотите сделать.

String.find (): http://www.cplusplus.com/reference/string/string/find/

String.subStr (): http://www.cplusplus.com/reference/string/string/substr/

string str = "bin/obj/Debug/vc100.pdb";
    string checkString ("bin/obj/Debug");

     // Check if string starts with the check string
     if (str.find(checkString) == 0){
      // Check if last letter if a "/"
      if(str.substr(str.length()-1,1) == "/"){
        // Output strating at the end of the check string and for
        // the differnce in the strings.
        cout << str.substr(checkString.length(), (str.length() - checkString.length()) ) << endl;
      }
     }
0 голосов
/ 24 августа 2011

Самый простой способ, который я могу придумать, используя стандартные функции C, будет:

char * string1 = "bin/obj/Debug"
char * string2 = "bin/obj/Debug/CloudServerPrototype/rc.write.1.tlog"
char result[64];
// the above code is just to bring the strings into this example

char * position = strstr(string1, string2);
int substringLength;
if(position != NULL){
    position += strlen(string2);
    substringLength = strchr(position, '/') - position;
    strncpy(result, position, substringLength);
}else{
    strcpy(result, string1); // this case is for when your first string is not found
}

cout << result;

Первое, что происходит, - это поиск подстроки string1 в анализируемой строке string2. Как только мы нашли начальную точку и, предположив, что она вообще там была, мы добавляем длину этой подстроки к этой начальной точке, используя арифметику указателя, а затем находим длину полученной строки, вычитая начальную позицию из конечной позиции, которая находится с strchr(position, '/'). Затем мы просто копируем эту подстроку в буфер, и она там печатается cout.

Я уверен, что есть хитрый способ сделать это с std::string, но я оставлю это любому, кто может лучше объяснить строки c ++, мне так и не удалось освоиться с ними, хаха

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...