Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не работает функция, которая делит строку по разделителю / 12 сообщений из 12, страница 1 из 1
16.01.2014, 17:36
    #38528621
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
Функция разделяет строку string str на части, каждая часть ограничена разделителем string razdelitel, результат записывается в массив result_mass[200]

1) она не работает если разделитель не писать текстом "1234", а передавать через переменную
то есть если массив razdelitel_ch заменить на "1234" (то есть записать текстом), то все работает, а мой пример нет

2) даже если писать разделитель текстом, то функция работает с ошибкой, она разделяет строку даже когда встретит какой то один символ из тех что входят в разделитель, а нужно делить только когда встречаются все символы которые входят в разделитель.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void explode(string str, string razdelitel, string result_mass[200]){
    int i=0;
    for (i=0; i<sizeof(result_mass); i++){result_mass[i]="";}
 
    char buff[65535];
    char razdelitel_ch[5];
 
    strcpy(buff,str.c_str());  //присвоение string в char
    strcpy(razdelitel_ch,razdelitel.c_str());  //присвоение string в char
 
    
    int q = -1;
    char * p = strtok(buff,razdelitel_ch);    //разбитие на лексемы
    while (p!=0){                    //проверка
        ++q;
        result_mass[q] = p;        //присвоение в массив новой лексемы до разделителя
        p = strtok(NULL,razdelitel_ch);       //переход к следующей
    }
...
Рейтинг: 0 / 0
16.01.2014, 17:47
    #38528650
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
void explode(string str, string razdelitel, string result_mass[200]){


Должно быть

Код: plaintext
1.
std::vector< std::string > explode( const std::string &str, const std::string &delimiter )


или
Код: plaintext
1.
std::vector< std::string > explode( const std::string &str, const char *delimiter )



for (i=0; i<sizeof(result_mass); i++){result_mass[i]="";}

Эта инициализация не нужна.
Изначально массив и так будет заполнен пустыми строками.


char buff[65535];
char razdelitel_ch[5];

Это всё не нужно.

char * p = strtok(buff,razdelitel_ch); //разбитие на лексемы

cplusplus.com<cstring>

function
strtok

char * strtok ( char * str, const char * delimiters );

Split string into tokens
A sequence of calls to this function split str into tokens, which are sequences of contiguous characters separated by any of the characters that are part of delimiters .


У тебя же видимо постановка задачи другая.
...
Рейтинг: 0 / 0
16.01.2014, 20:17
    #38528842
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
MasterZiv,

for (i=0; i<sizeof(result_mass); i++){result_mass[i]="";}
нужен когда функция вызывается в цикле и массив не обнуляется, но это не так важно, главное что сама функция работает не так

Первый пункт уже не актуален,
Код: plaintext
1.
  char * p = strtok(buff,razdelitel.c_str());    //разбитие на лексемы

вот так все работает

Но почему то если встречается символ который входит в разделитель все делится неправильно.

Может надо использовать другую функцию не strtok() ? подскажите какую и как.

Написал уже другую функцию где прохожу весь массив char который нужно разделить просто в цикле for, но способ работает очень медленно

Код: plaintext
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.
void explode(string text, string razdelitel, string result_mass[200]){
	string result;
	int i=0, n=0, j=0;

	for (i=0; i<sizeof(result_mass); i++){result_mass[i]="";}
	char text_ch[65535];
	char razdelitel_ch[15];

	strcpy(text_ch, text.c_str()); 
	strcpy(razdelitel_ch, razdelitel.c_str());
	ev_time_start =clock();
	for (i=0; i<sizeof(text_ch); i++){
		if(text_ch[i]==0){break;}
		if(text_ch[i]==razdelitel_ch[0]&&text_ch[i+1]==razdelitel_ch[1]&&text_ch[i+2]==razdelitel_ch[2]&&text_ch[i+3]==razdelitel_ch[3]){


			for (j=i+4; j<sizeof(text_ch); j++){

				if(text_ch[j]==razdelitel_ch[0]&&text_ch[j+1]==razdelitel_ch[1]&&text_ch[j+2]==razdelitel_ch[2]&&text_ch[j+3]==razdelitel_ch[3]){n++;break;}


				result_mass[n]=result_mass[n]+text_ch[j];
				i=j;
			}}}
	ev_time_end =clock();
	ev_time = (double)(ev_time_end-ev_time_start)/1000;
	_cprintf("sikl:%f ", ev_time);_cprintf("sec");_cprintf("\n");

}



Помогите или исправить первую функцию explode или оптимизировать вторую
...
Рейтинг: 0 / 0
16.01.2014, 22:09
    #38528936
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
trom,

не мешай в кучу С строковые функции и std::string
...
Рейтинг: 0 / 0
16.01.2014, 22:32
    #38528962
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
Изопропил,

входные данные должны быть только на string, как тогда сделать что использовать подскажите ?
...
Рейтинг: 0 / 0
16.01.2014, 22:46
    #38528983
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
tromИзопропил,

входные данные должны быть только на string, как тогда сделать что использовать подскажите ?
ну так и внутри используйте методы std::string
std::string::find например
...
Рейтинг: 0 / 0
16.01.2014, 23:13
    #38529003
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
Изопропил,

std::string::find
возвращает первую позицию искомого значения. А дальше как искать до конца строки?
...
Рейтинг: 0 / 0
17.01.2014, 00:23
    #38529043
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
tromвозвращает первую позицию искомого значения. А дальше как искать до конца строки?
прибавить длину искомой строки и искать с позиции
...
Рейтинг: 0 / 0
17.01.2014, 12:00
    #38529313
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
Изопропилtrom,

не мешай в кучу С строковые функции и std::string

это как раз не страшно, если правильно делать.
...
Рейтинг: 0 / 0
17.01.2014, 12:04
    #38529324
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
trom,

я в итоге не понял в чем проблема у тебя. тебе надо строку разбивать по одному из символов из строки с руководителями, или только по целой строке? что является разделителем, вся строка, или символы в ней?
...
Рейтинг: 0 / 0
18.01.2014, 23:27
    #38530729
trom
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
MasterZiv,

вот сам разобрался
просто аналог expolode как в php нужен был

Код: plaintext
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.
void explode_string(string str, string razdelitel, string result_mass[200]){
 
    int dlinna_razdelitela=razdelitel.length();
    size_t pos;
    size_t pos1;
    int n=0, ot=0, doo=0, dlinna=0;
 
    for (int i=0; i<str.length(); i++){
 
        pos = str.find(razdelitel, i);
        if (pos != string::npos){
 
            pos1 = str.find(razdelitel, pos+1);
 
            ot=pos+dlinna_razdelitela;
            doo=pos1;
            dlinna=doo-ot;
 
            if (pos1 != string::npos){result_mass[n] = str.substr (ot,dlinna);}
            else{result_mass[n] = str.substr (ot);}
 
            n++;
            
 
            i=pos+dlinna_razdelitela;}
 
    }
 
}
...
Рейтинг: 0 / 0
19.01.2014, 00:34
    #38530756
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не работает функция, которая делит строку по разделителю
trom,

еще раз прочитай моей первый пост в теме ...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не работает функция, которая делит строку по разделителю / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]