Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/41: Рейтинг темы: голосов - 41, средняя оценка - 4.56
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688

Деление строки на подстроки

19.01.2012, 12:03. Показов 8417. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветсвую.
Вопрос такого плана, в php есть очень удобная функция explode.
Её смысл в следующем:
PHP
1
2
$data = "word1|word2|word3|...|wordn";
list($var1,$var2,$var3,...,varn) = explode("|",$data);
Функция разбивает строку, разделённую каким бы то ни было символом (в данном примере "|") и записывает кусочки в соответствующие переменные.
Результатом будет
PHP
1
2
3
$var1=word1;
$var2=word2;
//и так далее
Есть ли что-нибудь подобное в си++?
Так как, языки родственные, я тешусь надежной, что есть.
Пришёл в голову такой вариант:
C++
1
AnsiString var1 = string1.SubString(0,string1.Pos("|")-1);
Но таким способом я могу разделить строку только на то, что будет до первого разделителя и после него, а надо делить на несколько кусочков.

Подскажите пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.01.2012, 12:03
Ответы с готовыми решениями:

Деление строки на подстроки
написать программу разбивающую строки на подстроки в зависимости от введенного к (количество подстрок) на языке С, не знаю как сделать,...

Строка: Написать функцию выделения подстроки из заданной строки длиной К с элемента строки с номером N.
Написать функцию выделения подстроки из заданной строки длиной К с элемента строки с номером N. Ввод и вывод в основной программе, все...

Деление строки на подстроки по условию
Добрый день помогите реализовать такую проблему: Есть в массив данных q = "191186, Малая Конюшенная ул., 1/3, оф. В-21"; ...

15
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
19.01.2012, 12:05
Цитата Сообщение от NapalmRain Посмотреть сообщение
Есть ли что-нибудь подобное в си++?
В Си есть стандартная функция strtok ()
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
19.01.2012, 12:07
Цитата Сообщение от NapalmRain Посмотреть сообщение
Так как, языки родственные, я тешусь надежной, что есть.
Они не родственные.
Цитата Сообщение от NapalmRain Посмотреть сообщение
Но таким способом я могу разделить строку только на то, что будет до первого разделителя и после него, а надо делить на несколько кусочков.
Цикл?

А еще можете посмотреть в сторону boost/algorithm/string/split.hpp.
0
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
19.01.2012, 12:24  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
Цикл?
Грамозско.

Цитата Сообщение от fasked Посмотреть сообщение
Они не родственные.
Удивлён, уж больно похожи.

Цитата Сообщение от go Посмотреть сообщение
В Си есть стандартная функция strtok ()
Ушёл пробовать.

Добавлено через 11 минут
Прочитал про strtok ();
Попробовал. В принципе, удобно, но опять, таки циклом решать приходится, ну или прописывать отдельно задание каждой переменной.
Хотя, это всё таки удобнее, чем через сабстринг.
Благодарю.
Если у кого есть ещё варианты, буду примного благодарен. Так как истина всё таки познаётся в сравнении.
Кстати, к слову о неродственности

Не по теме:

в php тоже есть функция strtok и работает она точно так же.
И вообще, начав изучать с++, уже уверенно пользуясь php, был уверен, что это чуть ли не один и тот же язык.
Да и до сих пор так думаю.

0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
19.01.2012, 12:29
Цитата Сообщение от NapalmRain Посмотреть сообщение
В принципе, удобно, но опять, таки циклом решать приходится,
Почти везде циклы. Даже просто на выделить слова из строки string тоже цикл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include <sstream>
        
int main() {
   std::string s("Hello  world !!!");
   std::istringstream buf(s);
   std::string temp;
        
   while ( buf >> temp )
      std::cout << temp << std::endl;
                         
   return 0;
}
http://liveworkspace.org/code/... a427b80d3c
0
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
19.01.2012, 12:33  [ТС]
Цитата Сообщение от go Посмотреть сообщение
Почти везде циклы.
Согласен.
Но ведь если бы была возможность реализовать всё в одну строку, было бы на много веселее
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
19.01.2012, 13:14
Цитата Сообщение от NapalmRain Посмотреть сообщение
Но ведь если бы была возможность реализовать всё в одну строку, было бы на много веселее
Напишите функцию, и получится вызов в одну строку
Например,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
 
std::vector<std::string> strtok(const std::string , const std::string );
 
int main()
{
    std::string s(",Hello  world,!!!");
    std::string d (" ,.");
    std::vector<std::string> v;
    
    v = strtok (s, d);
    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
 
    return 0;
}
 
std::vector<std::string> strtok(const std::string s, const std::string DELIM)
{
    std::vector<std::string> v;
    std::string tmp;
    size_t l, r;
 
    for ( l = s.find_first_not_of(DELIM), r = s.find_first_of(DELIM, l) ; 
        l != std::string::npos ; l = s.find_first_not_of(DELIM, r), r = s.find_first_of(DELIM, l) )
    {
        tmp = s.substr(l, r - l);
        v.push_back(tmp);
    }
    return v;
}
http://liveworkspace.org/code/... 3aaf45aaea
1
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
19.01.2012, 13:20  [ТС]
Цитата Сообщение от go Посмотреть сообщение
В Си есть стандартная функция strtok ()
Вернулся с грустным лицом.
Есть подобные функции, но не с char а с string?
Пока передавал в качестве параметров циферки да английские буковки, всё было не плохо, но вот русские буковки он пинамать отказывается. И это грустно.
Да и конвертить постоянно из стринг в чар и обратно не очень-то удобно.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
19.01.2012, 13:25
Цитата Сообщение от NapalmRain Посмотреть сообщение
Есть подобные функции, но не с char а с string?
А предыдущий пост? Я что-то подобное реализовал. Посмотрите как устроен (возвращает вектор подстрок)

Добавлено через 52 секунды
Цитата Сообщение от NapalmRain Посмотреть сообщение
Вернулся с грустным лицом.
Я предупреждал, что она для Си
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
19.01.2012, 13:52
NapalmRain, ну так сделайте себе такую функцию, если нужна...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
 
int split_string_to_vector(const std::string & str, std::vector<std::string> & vec, const char sep){
    std::istringstream ist(str);
    std::string tmp;
    
    vec.clear();
    while ( std::getline(ist, tmp, sep) )
        vec.push_back(tmp);
    
    return vec.size();
}
 
 
int main(){
    const char SEP = '|';
    std::string str;
    std::vector<std::string> vec;
 
    while ( std::cout << "String: " && std::getline(std::cin, str) && ! str.empty() ){
        std::cout << split_string_to_vector(str, vec, SEP) << " tokens:" << std::endl;
        std::copy(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    }
 
    return 0;
}
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.01.2012, 14:37
Цитата Сообщение от NapalmRain Посмотреть сообщение
Есть ли что-нибудь подобное в си++?
- да конечно
Считать из файла три предложения и вывести их в обратном порядке
1
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
19.01.2012, 14:37  [ТС]
Всем спасибо!
Написал свою функцию, руководствуясь вашими советами.
Вроде как работает.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.01.2012, 14:50
Цитата Сообщение от NapalmRain Посмотреть сообщение
Всем спасибо!
Написал свою функцию, руководствуясь вашими советами.
Вроде как работает.
Велосипед же.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <vector>
#include <iterator>
 
int main()
{
    std::string str = "one|two three-four";
    std::vector< std::string > words;
    boost::split( words, str, boost::is_any_of(" \t|-"), boost::token_compress_on );
    std::copy( words.begin(), words.end(), std::ostream_iterator< std::string > (std::cout, "\n") );        
}
Результат - http://liveworkspace.org/code/... b64578830f
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
19.01.2012, 17:30
Цитата Сообщение от easybudda Посмотреть сообщение
ну так сделайте себе такую функцию, если нужна...
Не обязательно делать, можно использовать, например, boost::split
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
 
 
int main()
{
   std::string s("Hello|  world|A B");
   std::vector<std::string> v;
   
   boost::split(v, s, boost::is_any_of("|"));
   std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
 
   return 0;
}
http://liveworkspace.org/code/... 13e11f14a9
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
19.01.2012, 17:51
Цитата Сообщение от go Посмотреть сообщение
можно использовать, например...
... или
C++
1
QStringList split ( const QString & sep, SplitBehavior behavior = KeepEmptyParts, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const
класса QString. С той лишь оговоркой, что должна быть установлена библиотека boost или Qt...
1
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
19.01.2012, 21:10  [ТС]
Дорогие друзья, примного всем благодарен. Всё сделал)
Всё работает именно так как хотелось)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.01.2012, 21:10
Помогаю со студенческими работами здесь

Деление строки на подстроки размером 5 символов каждая
Здравствуйте товарищи программисты! Помогите решить задачу :cry:: пользователь вводит строку символов. Написать функцию, которая делит...

Поиск подстроки внутри данной строки, замена найденной подстроки на другую строку
Выполнить поиск подстроки внутри данной строки,замену найденной подстроки на другую строку Пример Исходная строка: aaaabbbaaa ...

Даны две строки: S1 и S2. Удалить из строки S1 все подстроки, совпадающие с S2
8. Даны две строки: S1 и S2. Удалить из строки S1 все подстроки, совпадающие с S2. Если таких подстрок нет, то вывести S1 без изменений.

Строки. Выделить из строки все подстроки, содержащие числа, и преобразовать в тип integer
Буду очень признателен если вы поможете с этим заданием. А задание таково: у нас есть строка S, она имеет такой вид (общий) =&gt; S:='123...

Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, то вывести строку S без изменений


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru