powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не работает функция, которая делит строку по разделителю
12 сообщений из 12, страница 1 из 1
Не работает функция, которая делит строку по разделителю
    #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
Не работает функция, которая делит строку по разделителю
    #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
Не работает функция, которая делит строку по разделителю
    #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
Не работает функция, которая делит строку по разделителю
    #38528936
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,

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

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

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

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

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

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

я в итоге не понял в чем проблема у тебя. тебе надо строку разбивать по одному из символов из строки с руководителями, или только по целой строке? что является разделителем, вся строка, или символы в ней?
...
Рейтинг: 0 / 0
Не работает функция, которая делит строку по разделителю
    #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
Не работает функция, которая делит строку по разделителю
    #38530756
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
trom,

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


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