Функция разбора строки
От: Olegator  
Дата: 05.09.03 20:50
Оценка:
Есть задача: разобрать произвольную строку символов так, чтобы в результате получился массив, содержащий слова этой строки по отдельности.

Как реализовать эту задачу в виде функции на C++?
RSDN@Home
Re: Функция разбора строки
От: Alvin  
Дата: 05.09.03 21:47
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Есть задача: разобрать произвольную строку символов так, чтобы в результате получился массив, содержащий слова этой строки по отдельности.


O>Как реализовать эту задачу в виде функции на C++?


Предположим, 'строка' — это класс, называющийся String, который умеет:
— инициализировать себя char* (конструктор и оператор присваивания)
— присоединять к себе символы и char* посредством оператора +=
— возвращать свою длину (метод length() )
— приводить себя к const char* (оператор const char*)

Тогда можно так:
void 
SplitString(const char *pszStringToSplit, const char *pszDelimiters, std::vector<String> &vecWords)
{
   String strCurWord("");
   vecWords.clear();
   for (;*pszStringToSplit; pszStringToSplit++)
   {
      for (const char *pszDelim = pszDelimiters; *pszDelim; pszDelim++)
      {
         if (*pszStringToSplit == *pszDelim)
         {
             if (strCurWord.length())
             {
                vecWords.push_back(strCurWord);
                strCurWord = "";
             }
         }
         else
             strCurWord += *pszStringToSplit;
      }
   }
}
Re: Функция разбора строки
От: Аноним  
Дата: 05.09.03 22:52
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Есть задача: разобрать произвольную строку символов так, чтобы в результате получился массив, содержащий слова этой строки по отдельности.


O>Как реализовать эту задачу в виде функции на C++?


Посмотри в сторону std::istringstream
Re: Функция разбора строки
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 06.09.03 07:47
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Есть задача: разобрать произвольную строку символов так, чтобы в результате получился массив, содержащий слова этой строки по отдельности.


O>Как реализовать эту задачу в виде функции на C++?


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using std::cout;
using std::endl;

int not_isspace(char c)
{
    return !isspace(c);
}

void split(const std::string& s,std::vector<std::string>& vec)
{
    using std::string;
    using std::vector;
    using std::find_if;
    if (s.size() == 0) return;
    //struct temp
    //{
    //    temp(bool isspace):_b(isspace){}
    //    int operator()(char c) const
    //    {
    //        return isspace(c) ^ !_b;
    //    }
    //    bool _b;
    //};
    typedef string::const_iterator str_ci;
    //str_ci begin_of_the_word = find_if(s.begin(),s.end(),temp(false));
    str_ci begin_of_the_word = find_if(s.begin(),s.end(),not_isspace);
    while(begin_of_the_word != s.end()){
        //str_ci end_of_the_word = find_if(begin_of_the_word,s.end(),temp(true));
        str_ci end_of_the_word = find_if(begin_of_the_word,s.end(),isspace);
        vec.push_back(string(begin_of_the_word,end_of_the_word));
        //begin_of_the_word = find_if(end_of_the_word,s.end(),temp(false));
        begin_of_the_word = find_if(end_of_the_word,s.end(),not_isspace);
    }
}

int _tmain()
{
    std::vector<std::string> vec;
    split("alex rosa dima",vec);
    std::copy(vec.begin(),vec.end(),std::ostream_iterator<std::string>(cout," "));
    cout << endl;
    return 0;
}


Ждем нового стандарта и новых компиляторов, которые будут компилировать закоментированные строки.
... << RSDN@Home 1.1 beta 1 >>
Re[2]: Функция разбора строки
От: Alvin  
Дата: 06.09.03 10:55
Оценка:
Забыл еще в конце одну вещь...
A>
A>void 
A>SplitString(const char *pszStringToSplit, const char *pszDelimiters, std::vector<String> &vecWords)
A>{
A>   String strCurWord("");
A>   vecWords.clear();
A>   for (;*pszStringToSplit; pszStringToSplit++)
A>   {
A>      for (const char *pszDelim = pszDelimiters; *pszDelim; pszDelim++)
A>      {
A>         if (*pszStringToSplit == *pszDelim)
A>         {
A>             if (strCurWord.length())
A>             {
A>                vecWords.push_back(strCurWord);
A>                strCurWord = "";
A>             }
A>         }
A>         else
A>             strCurWord += *pszStringToSplit;
A>      }
A>   }
     if (strCurWord.length())
        vecWords.push_back(strCurWord);
A>}
A>
Re: Функция разбора строки
От: Юнусов Булат Россия  
Дата: 06.09.03 18:40
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Есть задача: разобрать произвольную строку символов так, чтобы в результате получился массив, содержащий слова этой строки по отдельности.


O>Как реализовать эту задачу в виде функции на C++?



typedef std::vector < std::string > string_vector;
typedef boost::shared_ptr< string_vector > string_vector_ptr;

string_vector_ptr split(const std::string & src)
{
    string_vector_ptr p(new string_vector);
    std::strstream ss;
    ss << src;
    std::copy(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>(), std::back_inserter(*p));
    return p;
}

int main(int argc, char* argv[])
{
    string_vector_ptr p = split("Hello World, RSDN - Forever!");
    std::copy(p->begin(), p->end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    return 0;
}
Re[2]: Функция разбора строки
От: Юнусов Булат Россия  
Дата: 07.09.03 02:23
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>string_vector_ptr split(const std::string & src)

ЮБ>{
ЮБ> string_vector_ptr p(new string_vector);
ЮБ> std::strstream ss;
ЮБ> ss << src;
ЮБ> std::copy(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>(), std::back_inserter(*p));
ЮБ> return p;
ЮБ>}


Так красявше, только vc6 не переварит
string_vector_ptr split(const std::string & src)
{
    std::stringstream ss;
    ss << src;
    return string_vector_ptr(new string_vector(std::istream_iterator<std::string>(ss), std::istream_iterator<std::string>()));
}
Re[3]: Функция разбора строки
От: Юнусов Булат Россия  
Дата: 07.09.03 02:46
Оценка: 27 (3)
Здравствуйте, Юнусов Булат, Вы писали:

При желании можно ужать и до одной строки ( кто меньше ) но сей опус только 7.1 и сьест
string_vector_ptr split(const std::string & src)
{
    return string_vector_ptr(new string_vector(std::istream_iterator<std::string>(std::stringstream(src)), std::istream_iterator<std::string>()));
}
Re[4]: Функция разбора строки
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 07.09.03 06:23
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, Юнусов Булат, Вы писали:


ЮБ>При желании можно ужать и до одной строки ( кто меньше ) но сей опус только 7.1 и сьест


хъ

А полстрочки можешь?
... << RSDN@Home 1.1 beta 1 >>
Re: Функция разбора строки
От: Аноним  
Дата: 12.09.03 08:51
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Есть задача: разобрать произвольную строку символов так, чтобы в результате получился массив, содержащий слова этой строки по отдельности.


O>Как реализовать эту задачу в виде функции на C++?

Попробуй стандартную функцию С strtok() (хидер string.h) она лексимезирует строку.
char * result;
char temp[10000];

result=strtok(Temp.c_str()," ");
while (result!=NULL)
{
//обрабатываеш слово здесь у меня создается новая строка.
// Дробление строки идет по пробелу
strcat(temp,result);
strcat(temp," ");
result=strtok(NULL," ");
}
return temp;
Re: Функция разбора строки
От: misha  
Дата: 06.10.03 04:54
Оценка:
Здравствуйте, Olegator, Вы писали:

O>Есть задача: разобрать произвольную строку символов так, чтобы в результате получился массив, содержащий слова этой строки по отдельности.


O>Как реализовать эту задачу в виде функции на C++?


Смотрите описание функции strtok (кстати, между словами в предложение может сотоять не только символ пробела, но и например символ табуляции и т.д.)
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.