С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

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

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

28.05.2012, 18:55. Просмотров 1221. Ответов 8
Метки нет (Все метки)

Есть строка:

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 значения не имеет.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2012, 18:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разбить строку (C++):

Разбить строку - C++
Просьба написать программу на С++ , которая разбивает строку длинной в 200 символов на строки по 20.

Разбить строку - C++
У меня есть строка string^ str в неё записано 6 символов. Как мне разбить эту строку на еще три строки в каждой из которых будут по два...

Разбить строку на 3 значения - C++
Всем доброго времени суток! Возникла проблема: не удается разбить строку дд/мм/гг, например: 05/07/16 на соответсвенно день, месяц и год. ...

Как разбить строку - C++
Как прочитать такую строку за один раз? Ukraine Kiev Donetsk Odessa и как мне строку разбить на слова и добавить в вектор. ...

Разбить строку на слова - C++
Здравствуйте! Решаю задачу, надо разбить предложение на слова с помощью функции strtok. Делаю вот так но не уверен что это правильно....

Как разбить строку - C++
Здравствуйте! Как извлечь из вводимой строки только символы? К примеру, вводим &quot; asd sss 12&quot;, а на выходе получаем asd, sss и 12?...

8
Andrey.K
343 / 264 / 15
Регистрация: 14.11.2010
Сообщений: 482
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;
}
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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;
}
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 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/f4cdea602caec555cb8e683a2da6ace7
1
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/> и т.д.
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 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;
}
3
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. Как это можно поправить ?
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
29.05.2012, 05:41 #8
нет, строка одна (v.size() == 1), у вас же там '\n'
0
ired
0 / 0 / 0
Регистрация: 06.04.2012
Сообщений: 16
29.05.2012, 11:41  [ТС] #9
Цитата Сообщение от igorrr37 Посмотреть сообщение
нет, строка одна (v.size() == 1), у вас же там '\n'
У меня есть строка
myname\nmysecondname
После такой рабивки \n почему-то остается у myname.
0
29.05.2012, 11:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2012, 11:41
Привет! Вот еще темы с ответами:

разбить строку в массив - C++
Как разбить массив символов в отдельный массив по слову?Я вот что-то написал,проде бы правильно,но когда например ввожу строку &quot;heavy...

Разбить строку на слова - C++
Добрый день. Есть массив char (say), в него вводят строку (два-три слова) с пробелами и без пробела в конце. Цикл разбивает её на отдельные...

Разбить строку на слова - C++
Разбить строку на слова. Все слова записать в отдельную строку. Помогите пожалуйста не получается. #include &lt;iostream&gt; #include...

Разбить строку string на подстроки - C++
Имеется строка string &quot;один два три четыре пять шесть семь восемь девять&quot;. Как ее разбить на подстроки из трех слов, чтоб получились...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.