Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.01.2012, 12:01   #1
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
Вопрос Деление строки на подстроки

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

Подскажите пожалуйста.
NapalmRain вне форума Ответить с цитированием
Старый 19.01.2012, 12:55   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

В дотнетовском C++ есть метод Split
http://msdn.microsoft.com/ru-ru/libr...vs.90).aspx#Y0

Цитата:
Код:
AnsiString var1 = string1.SubString(0,string1.Pos("|")-1);
А что мешает сделать это в цикле?
На первой итерации искать с 0, на последующих - с string1.Pos("|")+1. И так пока символ "|" не перестанет встречаться, или строка не кончится
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 19.01.2012, 13:00   #3
AlexDark
Форумчанин
 
Аватар для AlexDark
 
Регистрация: 23.12.2011
Сообщений: 117
По умолчанию

делал как то так...

Код:
vector<string>   Explode(string str,char divider)
{
	vector<string> divided;
	int pos=0;


	for(int i=0;i<str.size();i++)
	{
		if(str[i]==divider)
		{
			string tmpstr = str.substr(pos,i-pos);
			divided.push_back(tmpstr);
			pos=i+1;
		}
	}
	string tmpstr = str.substr(pos,str.size());
	divided.push_back(tmpstr);
	return divided;
}
AlexDark вне форума Ответить с цитированием
Старый 19.01.2012, 13:54   #4
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
В дотнетовском C++ есть метод Split
А что мешает сделать это в цикле?
На первой итерации искать с 0, на последующих - с string1.Pos("|")+1. И так пока символ "|" не перестанет встречаться, или строка не кончится
Например то, что я понятия не имею как это сделать
в качестве эксперемента написал вот так:
Код:
AnsiString str = Edit1->Text;
AnsiString s1 = str.SubString(0,str.Pos("|")-1);
AnsiString s2 = str.SubString(str.Pos("|")+1,str.Pos("|")-1);
AnsiString s3 = str.SubString(str.Pos("|")+1,str.Pos("|")-1);
ShowMessage(s1+"\n"+s2+"\n"+s3);
И он мне выдаёт s1 как надо, s2 то же как надо, но жлиной не больше чем s1, то есть половину символов теряю, а s3 соответственно равна s2 причём в таком же обрезанном варианте.
NapalmRain вне форума Ответить с цитированием
Старый 19.01.2012, 14:13   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

А способ, предложенный AlexDark, вас чем не устраивает?

В Borland C++ Builder можно поступить так:
Код:
TStringList *stringList = new TStringList;
stringList->Delimiter = '|';
stringList->Clear();
stringList->DelimitedText="word1|word2|word3|...|wordn";
AnsiString s1 = stringList->Strings[0]; // word1
AnsiString s2 = stringList->Strings[1]; // word2
AnsiString s3 = stringList->Strings[2]; // word3
delete stringList;
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 19.01.2012 в 14:19. Причина: Узрел "Edit1->Text". Borland C++ Builder detected
Luuzuk вне форума Ответить с цитированием
Старый 19.01.2012, 14:33   #6
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
А способ, предложенный AlexDark, вас чем не устраивает?
Вполне устраивает. Просто ищу разные варианты и сравниваю, что удобнее, что лучше.
NapalmRain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цик отвечающий за деление строки на две под строки А-р-т-ё-м Помощь студентам 1 13.11.2011 19:40
Даны строки S и S0. Удалить из строки S все подстроки, совпадающие с S0 . Если совпадающих подстрок нет, Шпунюся Помощь студентам 1 16.12.2010 21:02
Разделение строки на подстроки (Delphi) Zilian Помощь студентам 3 12.05.2010 20:06
Строки, подстроки Grom48 Помощь студентам 0 30.04.2010 01:19
строки и подстроки Work Group Помощь студентам 1 17.11.2009 15:02