Форум программистов, компьютерный форум CyberForum.ru

Разбить строку - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
ired
0 / 0 / 0
Регистрация: 06.04.2012
Сообщений: 16
28.05.2012, 18:55     Разбить строку #1
Есть строка:

first<br/>second<br/>third<br/>...
Нужно написать функцию, чтобы в результате получилось на выходе
first
second
third
например в vector<string>
Вот что смог "составить" я:

C
1
2
3
4
5
6
7
8
9
10
11
void mk_tokens(const wstring& str, vector<wstring>& tokens, const wstring& delimiters)
{
    wstring::size_type lastPos = str.find_first_not_of(delimiters, 0);
    wstring::size_type pos = str.find_first_of(delimiters, lastPos);
    while (wstring::npos != pos || wstring::npos != lastPos)
    {
        tokens.push_back(str.substr(lastPos, pos - lastPos-1));
        lastPos = str.find_first_not_of(delimiters, pos);
        pos = str.find_first_of(delimiters, lastPos);
    }
}
Но он так разделяет не правильно т.е.
mk_tokens(my_str, my_vector, "<br/>");
Как разделители он берет все символы (<, b, r, /, >). Как это поправить ? Напомню выход должен быть таким:
first
second
third
wstring \ string значения не имеет.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 18:55     Разбить строку
Посмотрите здесь:

C++ разбить строку в массив
Разбить строку C++
C++ Разбить строку на слова
Разбить строку C++
Как разбить строку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrey.K
 Аватар для Andrey.K
338 / 259 / 15
Регистрация: 14.11.2010
Сообщений: 480
28.05.2012, 19:56     Разбить строку #2
Если правильно понял, то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
void Line(string s)
{
    for(int i=0;i<s.length();i++)
    {
        if(s[i]=='<' && s[i+1]=='b' && s[i+2]=='r' && s[i+3]=='/' && s[i+4]=='>') 
        {
            cout<<endl;
            s.erase(i,4);
        }
        else cout<<s[i];
    }
}
int main()
{
    string s="first<br/>second<br/>third<br/>";
    Line(s);
    getch();
    return 0;
}
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
28.05.2012, 21:05     Разбить строку #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <iterator>
#include <boost/algorithm/string/replace.hpp>
 
int main()
{
    std::wifstream wifs("1.txt");
    if(wifs.is_open())
    {
        std::wstring ws((std::istreambuf_iterator<wchar_t>(wifs.rdbuf())), std::istreambuf_iterator<wchar_t>());
        boost::algorithm::replace_all(ws, L"<br/>", L" ");
        std::wistringstream wiss(ws);
        while(wiss >> ws) std::wcout << ws << std::endl;
    }
    else std::cerr << "Unable to open file\n";
    wifs.close();
    return 0;
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
28.05.2012, 21:48     Разбить строку #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
 
 
void split(std::string const& str, std::string const& delimeter, std::vector<std::string> & tokens) {
   std::string::size_type first = 0, last = 0;
      
   while ((first = str.find_first_not_of(delimeter, last)) != std::string::npos) {
      last = str.find(delimeter, first);
      tokens.push_back(str.substr(first, last - first));   
   }
}
 
 
int main() {
   std::vector<std::string> tokens;
   split("first<br/>second<br/>third<br/>", "<br/>", tokens);
   std::copy(tokens.begin(), tokens.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
http://liveworkspace.org/code/f4cdea...8e683a2da6ace7
ired
0 / 0 / 0
Регистрация: 06.04.2012
Сообщений: 16
28.05.2012, 21:48  [ТС]     Разбить строку #5
Цитата Сообщение от Andrey.K Посмотреть сообщение
Если правильно понял, то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
void Line(string s)
{
    for(int i=0;i<s.length();i++)
    {
        if(s[i]=='<' && s[i+1]=='b' && s[i+2]=='r' && s[i+3]=='/' && s[i+4]=='>') 
        {
            cout<<endl;
            s.erase(i,4);
        }
        else cout<<s[i];
    }
}
int main()
{
    string s="first<br/>second<br/>third<br/>";
    Line(s);
    getch();
    return 0;
}
Слово-разделитель определяется "на ходу", такой вариант не подойдет.

Цитата Сообщение от igorrr37 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <iterator>
#include <boost/algorithm/string/replace.hpp>
 
int main()
{
    std::wifstream wifs("1.txt");
    if(wifs.is_open())
    {
        std::wstring ws((std::istreambuf_iterator<wchar_t>(wifs.rdbuf())), std::istreambuf_iterator<wchar_t>());
        boost::algorithm::replace_all(ws, L"<br/>", L" ");
        std::wistringstream wiss(ws);
        while(wiss >> ws) std::wcout << ws << std::endl;
    }
    else std::cerr << "Unable to open file\n";
    wifs.close();
    return 0;
}

А что если в тексте есть пробелы ? Что-то вроде:
fisr ttt<br/>sec on;$x<br/> и т.д.
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
28.05.2012, 22:32     Разбить строку #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
с пробелами можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/regex.hpp>
 
int main()
{
    std::wstring s(L"fisr ttt<br/>sec on;$x<br/>");
    std::vector<std::wstring> v;
    boost::algorithm::split_regex(v, s, boost::wregex(L"<br/>"));
    for(auto const& val : v)
    {
        std::wcout << val << std::endl;
    }
    return 0;
}
ired
0 / 0 / 0
Регистрация: 06.04.2012
Сообщений: 16
29.05.2012, 03:32  [ТС]     Разбить строку #7
Цитата Сообщение от igorrr37 Посмотреть сообщение
с пробелами можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/regex.hpp>
 
int main()
{
    std::wstring s(L"fisr ttt<br/>sec on;$x<br/>");
    std::vector<std::wstring> v;
    boost::algorithm::split_regex(v, s, boost::wregex(L"<br/>"));
    for(auto const& val : v)
    {
        std::wcout << val << std::endl;
    }
    return 0;
}
Это чудо, спасибо.

Добавлено через 3 часа 1 минуту
Цитата Сообщение от igorrr37 Посмотреть сообщение
с пробелами можно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/regex.hpp>
 
int main()
{
    std::wstring s(L"fisr ttt<br/>sec on;$x<br/>");
    std::vector<std::wstring> v;
    boost::algorithm::split_regex(v, s, boost::wregex(L"<br/>"));
    for(auto const& val : v)
    {
        std::wcout << val << std::endl;
    }
    return 0;
}
Блин. опять немного не то.
Если есть строка:
hello\nworld. То после такой "разбивки" будет 2 строки:
hello\n, и world. Как это можно поправить ?
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
29.05.2012, 05:41     Разбить строку #8
нет, строка одна (v.size() == 1), у вас же там '\n'
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2012, 11:41     Разбить строку
Еще ссылки по теме:

как разбить строку C++
C++ Разбить строку на слова
Разбить строку на слова C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ired
0 / 0 / 0
Регистрация: 06.04.2012
Сообщений: 16
29.05.2012, 11:41  [ТС]     Разбить строку #9
Цитата Сообщение от igorrr37 Посмотреть сообщение
нет, строка одна (v.size() == 1), у вас же там '\n'
У меня есть строка
myname\nmysecondname
После такой рабивки \n почему-то остается у myname.
Yandex
Объявления
29.05.2012, 11:41     Разбить строку
Ответ Создать тему
Опции темы

Текущее время: 00:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru