Разбиение строки на слова

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Закрыто
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

04 фев 2007, 20:44

Как ни гневаются завсегдатаи форума при виде очередной темы в "Решите мне задачку", начинающуюся с "Разбить строку на слова...", как ни заявляют они, что это дело обсуждали здесь миллион раз, а все же поиск по форуму не помогает найти алгоритм для такого разбиения. Поэтому пишу здесь, а если AiK все-таки сделает раздел "Решение элементарных задач", эту тему можно перенести туда.

Код: Выделить всё

function strtok(var s:string;delims:string):string;
{Функция разбивает строку s на слова, разделенные символами-разделителями,
указанными в строке delims. Функция возвращает первое найденное слово, при 
этом из строки s удаляется начальная часть до следующего слова}
var res:string; state:byte; i:integer;
begin
  state:=1;
  res:='';
  if s='' then
  begin
    result:='';
    exit;
  end;
  while pos(s[state],delims)<>0 do
  begin
    inc(state);
    if state>length(s) then
    begin
      s:='';
      result:='';
      exit;
    end;
  end;
  while pos(s[state],delims)=0 do
  begin
     res:=res+s[state];
     inc(state);
     if state>length(s) then
     begin
       s:='';
       result:=res;
       exit;
     end;
  end;
  while pos(s[state],delims)<>0 do
  begin
    inc(state);
    if state>length(s) then
    begin
      s:='';
      result:=res;
      exit;
    end;
  end;
  delete(s,1,state-1);
  result:=res;
end;
Пример применения:
s:=' 123 a,aa !!! bbb !';
delims:=' ,!';
strtok(s,delims); //возвращает '123', s='a,aa !!! bbb !'
strtok(s,delims); //возвращает 'a', s='aa !!! bbb !'
strtok(s,delims); //возвращает 'aa', s='bbb !'
strtok(s,delims); //возвращает 'bbb', s=''
strtok(s,delims); //возвращает '', s=''

В языке С есть одноименная функция в strings.h
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

05 фев 2007, 14:15

Хыиуду писал(а):В языке С есть одноименная функция в strings.h
strtok() лучше не использовать. Такой вариант предпочтительнее:

Код: Выделить всё

template<typename _Outit>
void split(const std::string& str, _Outit _Where, const std::string& delim=",")
{
    std::string::size_type lpos = 0;
    std::string::size_type pos = str.find_first_of(delim, lpos);
    do
    {
        *_Where = str.substr(lpos,pos - lpos);
        // front_inserter, back_inserter and inserter will do
        // nothing with operator++
        ++_Where;
        lpos = ( pos == std::string::npos ) ?  std::string::npos : pos + 1;
        pos = str.find_first_of(delim, lpos);
    }
    while(lpos != std::string::npos);
}
2B OR NOT(2B) = FF
DeeJayC
Сообщения: 492
Зарегистрирован: 17 фев 2004, 11:26
Откуда: Ленинград (который Город на Неве)
Контактная информация:

13 фев 2007, 12:34

Я создаю новую тему по "решению типовых задач", а эту закрываю.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)

viel spass, DeeJayC
Закрыто