Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.98.108] |
|
Сообщ.
#1
,
|
|
|
Всем доброго времени суток, есть задача обработать строку и преобразовать ее в вектор, функция принимает саму строку, символ который является разделителем. в результате должен выйти вектор, то-есть вот пример:
char *s = "aabc:bbc:czsc"; char **vec = func(s,':'); где func - функция принимающая параметры (char *s, char b), char b - символ разделитель. И в результате вектор должен стать таким aabc'\0'bbc'\0'czsc'\0' Я так понял что нужно искать в строке символ разделитель и заменять его на null-terminated, думал как-то так for (int i = 0; i < strlen(s); s++) { if (s[i] = ':') { //вот что тут делать не могу понять } } |
Сообщ.
#2
,
|
|
|
Судя по примеру, тебе надо не преобразовать исходный вектор, а создать новый вектор векторов. Соответственно, надо сначала посчитать количество строк, затем выделить количество памяти под нужное количество char*, и после этого инизиализировать каждый из этих указателей.
Цитата skinex @ i < strlen(s) strlen вычисляет длину, проходя по всей строке. Поэтому тут надо вычислить её один раз заранее, а не считать на каждой итерации. |
Сообщ.
#3
,
|
|
|
Смотри тут (если конечно у тебя не строгое студенческое задание):
#include <iostream> #include <algorithm> #include <iterator> #include <regex> int main() { std::string Text = "111:222:333"; std::regex RegExp(":"); std::vector<std::string> Vector = {}; // заполняем вектор std::copy(std::sregex_token_iterator(Text.begin(), Text.end(), RegExp, -1), std::sregex_token_iterator(), std::back_inserter(Vector)); // печатаем вектор for(const auto &i:Vector) std::cout << i << "\n"; return 0; } |
Сообщ.
#4
,
|
|
|
Спасибо, изящное решение, но желательно решать без использования STL.
|
Сообщ.
#5
,
|
|
|
Цитата skinex @ Я так понял что нужно искать в строке символ разделитель и заменять его на null-terminated, думал как-то так наверное лучше сделай с копированием строк, а потом модифицируй так как тебе надо. вообще легкая задачка, откуда она? |
Сообщ.
#6
,
|
|
|
Работает, например, так:
char ** func(char *a, char c) { char **s, *aa=a; int k=0; while( a=strchr( a, c) ) k++,a++; s = new char*[k+1]; a = aa, k=0; while( aa=strchr( a, c) ) memcpy( s[k]=new char[aa-a+1], a,(int)(aa-a)), s[k++][aa-a]=0, a = aa+1; strcpy( s[k]=new char[strlen(a)+1], a); return s; } |
Сообщ.
#7
,
|
|
|
JoeUser, использовать regex в этом задании это как их пушки по воробьям. find + substr более чем достаточно.
Добавлено skinex, исходную строку можно менять? Добавлено Задача по с или си++? |
Сообщ.
#8
,
|
|
|
Цитата shm @ JoeUser, использовать regex в этом задании это как их пушки по воробьям. find + substr более чем достаточно. Тяжелое наследие Perl'а На нем прогаю с 1997 года, на Цэ++ присел (более-менее) плотно с 2012года. Ты просто обязан меня понять |