2014-10-31 7 views
-4

У меня есть данные в следующем виде:Выяснить определенную строку в C/C++

http://website.org/resource/id_xa5x8p_1sz_1s8rhrc 
http://website.org/resource/abc 
http://website.org/resource/id_xa5x8p_1sz_1s8rfcc 
http://website.org/resource/def 
http://website.org/resource/ghi 
http://website.org/resource/id_xa5x8p_1sz_1s8ryurc 
http://website.org/resource/id_xa5x8p_1sz_1s8rhrcwjf 
http://anyother/anthingelse/id_xa5x8p_1sz_1s8rhrc 
file://anyotherInfo/anthingelse1/id_xa5x8p_1sz_1s8rhrc 
file://anyotherInfo/anthingelse1/def/id_xa5x8p_1sz_1s8rhrc 
file://id_anyotherInfo/anthingelse1/def/id_xa5x8p_1sz_1s8rhrc 
file://anyotherInfo/id_anthingelse1/def/id_xa5x8p_1sz_1s8rhrc 
file://anyotherInfo/id_anthingelse1/def/ghi 

Мой ожидаемый результат является:

http://website.org/resource/id_xa5x8p_1sz_1s8rhrc 
http://website.org/resource/id_xa5x8p_1sz_1s8rfcc 
http://website.org/resource/id_xa5x8p_1sz_1s8ryurc 
http://website.org/resource/id_xa5x8p_1sz_1s8rhrcwjf 
http://anyother/anthingelse/id_xa5x8p_1sz_1s8rhrc 
file://anyotherInfo/anthingelse1/id_xa5x8p_1sz_1s8rhrc 
file://anyotherInfo/anthingelse1/def/id_xa5x8p_1sz_1s8rhrc 
file://id_anyotherInfo/anthingelse1/def/id_xa5x8p_1sz_1s8rhrc 
file://anyotherInfo/id_anthingelse1/def/id_xa5x8p_1sz_1s8rhrc 

Теперь я хочу, чтобы узнать все те URL, которые имеют символы как «id_» после последней косой черты. Один из способов, которые я знаю, и я реализовал, - это проанализировать этот строковый символ с помощью символа с самого начала и сохранить эту строку в массиве, пока я не получу пробел. Теперь я выбираю последний массив и обнаруживаю, имеет ли он id_ в начале.

Но моей проблемой является размер массива в C++, который присваивается apriori, предоставляя этот подход неосуществимым, когда есть много косых черт. Есть ли другой способ узнать это.

+1

[ 'станд :: строка :: find'] (http://en.cppreference.com/w/cpp/string/basic_string/find) является вашим другом. –

+0

Также [''] (http://www.cplusplus.com/reference/regex/) – CoryKramer

+3

C! = C++. В общем, пометьте только язык, который вы используете/компилируете. – crashmstr

ответ

-1

Вы должны иметь возможность легко узнать, если строки содержат «/ id_» с использованием зОго :: строки :: find_last_of http://en.cppreference.com/w/cpp/string/basic_string/find_last_of

+0

@ user380: Вы хотите, чтобы мы _guess_ при ошибке? –

+0

Возможно, небольшой пример будет очень полезен – user3809749

+0

@LightnessRacesinOrbit Очень жаль, что его решение действительно работает .. но, возможно, так как я новичок в C++, я думал, что это ошибка ... хотя это было не – user3809749

1

станда :: строка :: find_last_of

Если вы знаете, что ища «/ id_», то вы можете использовать find_last_of для получения последнего вхождения.

Возможно, вы также захотите найти последний экземпляр «/», чтобы подтвердить, что id_ найден после последнего «/».

+0

str.find_last_of ("/") дает мне число, подобное 25. Я не знаю, где я иду не так. ул = файл: // id_anyotherInfo/anthingelse1/Защита/id_xa5x8p_1sz_1s8rhrc – user3809749

0

Эта функция возвращает истину, если и только если строка содержит / характер, последний из которых следует немедленно id_:

bool has_id_after_last_slash(std::string const & url) { 
    // Finds the offset into the string where the last/character is. 
    size_t last_slash = url.find_last_of('/'); 

    // If this test succeeds then no/character was found. 
    if (last_slash == std::string::npos) { return false; } 

    // Compare the 3-character substring immediately following the last/character 
    // to "id_". Return true if they are equal. 
    return url.compare(last_slash + 1, 3, "id_") == 0; 
} 

Имя функции не является фантастическим, хотя.

(See a demo.)