2013-04-05 3 views
0

Я пытаюсь разобрать строку, содержащую строку моего XML-файла.Xml Parser - string :: find

std::string temp = "<Album>Underclass Hero</Album>"; 
int f = temp.find(">"); 
int l = temp.find("</"); 
std::string _line = temp.substr(f + 1, l-2); 

Это часть моего кода моей функции, которая должна фактически возвращать проанализированную строку. Я ожидал, что он вернет Underclass Hero. Вместо этого я получил Underclass Hero </Alb
(здесь между «<» и «/» пробелом, потому что я не мог написать их вместе).

Я смотрел std :: string :: находил несколько раз вверх и всегда говорил, что возвращает, если существует, положение первого символа первого совпадения. Здесь он дает мне последний символ строки, но только в моей переменной l.
f. Хорошо.

link to std::string::find

Так может кто-нибудь сказать мне, что я делаю неправильно?

ответ

5

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

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string temp = "<Album>Underclass Hero</Album>"; 
    int f = temp.find(">"); 
    int l = temp.find("</"); 
    std::string line = temp.substr(f + 1, l - f - 1); 
    //         ^^^^^^^^^ 
} 

Вот является live example.

Кроме того, будьте осторожны с такими именами, как _line. В соответствии с пунктом 17.6.4.3.2/1 C++ 11 Стандарт на:

[...] Каждое имя, которое начинается с символа подчеркивания зарезервирован для осуществления для использования в качестве имени в глобальном пространстве имен ,

+0

Спасибо, также огромное спасибо за подчеркивание. –

+0

@CGuy: Рад я мог помочь :) –

5

substr принимает длину как второй параметр, а не конечное положение. Попробуйте:

temp.substr(f + 1, l-f-1); 

Кроме того, пожалуйста, рассмотрите возможность использования реального XML-парсер, не пытайтесь его самостоятельно или с помощью other inappropriate means.

+0

LOL! Kinda свалка меня ... также спасибо –

3

Не делайте этого так!

«Синтаксический» «линии» файлов XML рано или поздно потерпит неудачу с попыткой. Пример: Ниже действует XML, но ваш код не получится:

<Album>Underclass Hero<!-- What about </ this --></Album> 

P.S .: Пожалуйста использование const, где это возможно:

std::string const temp = ... 
// ... 
std::string const line = ... 
+0

huh? Я, хотя вы не можете изменить постоянные переменные ...?! Я что-то пропустил? –

+0

Да ... не удалось, но я понятия не имел, как сделать это другим, более безопасным способом = / –