Как строчку делить на строчки?
От: Blitz Великобритания  
Дата: 13.04.04 23:55
Оценка:
Сдаюсь.

Как string "поделите меня пожалуйста" поделить на vector<string> oppa, где

oppa[0] = "поделите"
oppa[1] = "меня"
oppa[2] = "пожалуста"

Пожалуйста
Re: Как строчку делить на строчки?
От: peregrin  
Дата: 14.04.04 00:38
Оценка:
Здравствуйте, Blitz, Вы писали:

B>Сдаюсь.


B>Как string "поделите меня пожалуйста" поделить на vector<string> oppa, где


B>oppa[0] = "поделите"

B>oppa[1] = "меня"
B>oppa[2] = "пожалуста"

B>Пожалуйста


Например вот так:

#include <string>
#include <vector>

int main()
  {
  const std::string separators(" \t"); // разделители слов
  std::string s(" \t split \t me \t please \t "); // строка для разделения
  std::vector<std::string> oppa;
  size_t curr_str_begin, curr_str_end = 0;
  while ((curr_str_begin = curr_str_end) < s.length())
    {
    curr_str_begin = s.find_first_not_of(separators, curr_str_begin);
    curr_str_end   = s.find_first_of(separators, curr_str_begin);     
    if (curr_str_begin == s.npos) // это на случай пробелов в конце
      break;
    oppa.push_back(s.substr(curr_str_begin, curr_str_end - curr_str_begin));
    }
  }

Наверное можно и красивее
Re[2]: Как строчку делить на строчки?
От: Blitz Великобритания  
Дата: 14.04.04 00:44
Оценка:
Здравствуйте, peregrin, Вы писали:

P>Здравствуйте, Blitz, Вы писали:


B>>Сдаюсь.


B>>Как string "поделите меня пожалуйста" поделить на vector<string> oppa, где


B>>oppa[0] = "поделите"

B>>oppa[1] = "меня"
B>>oppa[2] = "пожалуста"

B>>Пожалуйста


P>Например вот так:


P>
P>#include <string>
P>#include <vector>

P>int main()
P>  {
P>  const std::string separators(" \t"); // разделители слов
P>  std::string s(" \t split \t me \t please \t "); // строка для разделения
P>  std::vector<std::string> oppa;
P>  size_t curr_str_begin, curr_str_end = 0;
P>  while ((curr_str_begin = curr_str_end) < s.length())
P>    {
P>    curr_str_begin = s.find_first_not_of(separators, curr_str_begin);
P>    curr_str_end   = s.find_first_of(separators, curr_str_begin);     
P>    if (curr_str_begin == s.npos) // это на случай пробелов в конце
P>      break;
P>    oppa.push_back(s.substr(curr_str_begin, curr_str_end - curr_str_begin));
P>    }
P>  }
P>

P>Наверное можно и красивее

Мне не поверят =( Моя маленькая курсовая програмка просто не может столько всего в себя включать... =((( Спасибо все равно.
Re[3]: Как строчку делить на строчки?
От: Peregrin  
Дата: 14.04.04 01:27
Оценка:
Здравствуйте, Blitz, Вы писали:

<...покоцано...>

B>Мне не поверят =( Моя маленькая курсовая програмка просто не может столько всего в себя включать... =((( Спасибо все равно.

Я не совсем понял в чем проблема, если честно Если "столько всего" это 2 инклуда — то без них все равно не получится использовать классы string и vector. Если нет — тогда что?
Re: Как строчку делить на строчки?
От: Юнусов Булат Россия  
Дата: 14.04.04 03:55
Оценка:
Здравствуйте, Blitz, Вы писали:

http://rsdn.ru/Forum/Message.aspx?mid=376778
Автор: Юнусов Булат
Дата: 07.09.03
Re: Как строчку делить на строчки?
От: Bell Россия  
Дата: 14.04.04 06:46
Оценка: 2 (1)
Здравствуйте, Blitz, Вы писали:

B>Сдаюсь.


B>Как string "поделите меня пожалуйста" поделить на vector<string> oppa, где


B>oppa[0] = "поделите"

B>oppa[1] = "меня"
B>oppa[2] = "пожалуста"

B>Пожалуйста



int main()
{
   using namespace std;

   string str = "mama mila ramu";
   istringstream istr(str);
   vector<string> words;
   words.reserve(8);
   copy(istream_iterator<string>(istr), istream_iterator<string>(), back_inserter(words));

   cout << words.size() << endl;
   copy(words.begin(), words.end(), ostream_iterator<string>(cout, "\n"));
   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re[3]: Как строчку делить на строчки?
От: Аноним  
Дата: 14.04.04 07:16
Оценка:
Здравствуйте, Blitz, Вы писали:


B>Мне не поверят =( Моя маленькая курсовая програмка просто не может столько всего в себя включать... =((( Спасибо все равно.


А где и на кого ты учишься
Re: Как строчку делить на строчки?
От: Аноним  
Дата: 14.04.04 16:05
Оценка:
Здравствуйте, Blitz, Вы писали:

B>Сдаюсь.


B>Как string "поделите меня пожалуйста" поделить на vector<string> oppa, где


B>oppa[0] = "поделите"

B>oppa[1] = "меня"
B>oppa[2] = "пожалуста"

B>Пожалуйста


boost::tokenzier ot boost::spirit
Re[4]: Как строчку делить на строчки?
От: Blitz Великобритания  
Дата: 14.04.04 16:58
Оценка:
Здравствуйте, Peregrin, Вы писали:

P>Здравствуйте, Blitz, Вы писали:


P><...покоцано...>


B>>Мне не поверят =( Моя маленькая курсовая програмка просто не может столько всего в себя включать... =((( Спасибо все равно.

P>Я не совсем понял в чем проблема, если честно Если "столько всего" это 2 инклуда — то без них все равно не получится использовать классы string и vector. Если нет — тогда что?

Да я понимаю, просто... нас официально string на c++ еще не учили (это я еще с Java их очень люблю), поэтому решила использовать их класс... Но в Java-то обычно все уже до тебя написано (думала, что такая функция уже есть, а тут =((), поэтому я не думала, что придется так глубоко в string закапываться. Если не проходили — не поверят. Они такие, эти лекторы фиговы...
Re[5]: Как строчку делить на строчки?
От: WolfHound  
Дата: 15.04.04 07:48
Оценка:
Здравствуйте, Blitz, Вы писали:

B>Они такие, эти лекторы фиговы...

[offtop ]
А если они читают? Хотя ели ты действительно из Ноттингема врятли ( даа во истину широка аудитория RSDN ).
Но один Астраханский зав. кафедрой тут точно все читает.
[/offtop ]
А вобще чтоли нельзя сказать им что тебе на форуме об этом расказали?
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Как строчку делить на строчки?
От: Free_fly Ниоткуда  
Дата: 15.04.04 18:41
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, Blitz, Вы писали:


B>>Они такие, эти лекторы фиговы...

WH>[offtop ]
WH>А если они читают? Хотя ели ты действительно из Ноттингема врятли ( даа во истину широка аудитория RSDN ).
WH>Но один Астраханский зав. кафедрой тут точно все читает.
WH>[/offtop ]
WH>А вобще чтоли нельзя сказать им что тебе на форуме об этом расказали?

Они за это по попе надают...
Re[5]: Как строчку делить на строчки?
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 15.04.04 19:31
Оценка:
Здравствуйте, Blitz, Вы писали:

[]

B>Да я понимаю, просто... нас официально string на c++ еще не учили (это я еще с Java их очень люблю), поэтому решила использовать их класс... Но в Java-то обычно все уже до тебя написано (думала, что такая функция уже есть, а тут =((), поэтому я не думала, что придется так глубоко в string закапываться. Если не проходили — не поверят. Они такие, эти лекторы фиговы...


А char* учили уже? Тогда позволю себе в порядке личного безумия запостить сию поделку (поковырялся минут пять и написал страх божий ):


//---------------------------------------------------------------------------
char* source_string = "I love  \t\n C++";
//---------------------------------------------------------------------------
bool is_separator(const char* separators, char c)
{
 // проверяет, является ли символ разделительным
  char ch;
  while((ch = *separators++))
    if(ch == c)
      return true;

return false;
}
//---------------------------------------------------------------------------
char* skip_separators(const char* source,const char* separators)
{
 // пропускает разделительные символы в начале строки
  const char* c = source;
  while(*c && is_separator(separators,*c))
      c++;
 return (char*)c;
}
//---------------------------------------------------------------------------
char** split_string(const char* source, const char* separators, int& result_count)
{
 // разбивает строку на массив строк по разделителям
  result_count = 0;

 // простая проверка корректности параметров
  if(!source || !*source)
    return NULL;

  char ch;
  char** result = NULL;

  // устанавливаем указатель на первый несепаратор
  const char* walker = skip_separators(source,separators);
  const char* word_begin = walker;

  if(!*walker)
   return NULL;

  int len = strlen(source);

  // и ходим по символам до конца строки, запоминая начало слова и его конец
  while((ch = *walker++), (walker <= &source[len+2]))
   {
     if(is_separator(separators,ch))
     {
       int word_len = walker - word_begin;
       char* word = new char[word_len];

       memcpy(word,word_begin,word_len-1);
       word[word_len-1] = 0;

       result_count++;

        if(!result)
         {
           result = new char*[result_count];
           result[0] = word; 
         } // if(!result)
        else
         {
            char** new_result = new char*[result_count];
            for(int i=0;i<result_count-1;i++)
              new_result[i] = result[i];

           new_result[result_count-1] = word;

           delete [] result;

           result = new_result;
         }

       walker = skip_separators(walker,separators);
       word_begin  = walker;
       walker++;

     } // if(is_separator

   }   // while

 return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Clear();

int cnt;
char** arr = split_string(source_string," \t\r\n",cnt);

 if(arr)
 {
   for(int i=0;i<cnt;i++)
   {
    Memo1->Lines->Add(arr[i]);
    delete [] arr[i];
   } // for
   delete [] arr;
 } // if(arr)

}
//---------------------------------------------------------------------------


вот такой косяк, в общем...
Re[6]: Как строчку делить на строчки?
От: Андрей Галюзин Украина  
Дата: 16.04.04 14:01
Оценка: 2 (1)
F> А char* учили уже? Тогда позволю себе в порядке личного безумия запостить сию поделку
F> (поковырялся минут пять и написал страх божий ):

А я позволю себе (тоже в порядке личного безумия) порекомендовать стандартную функцию strtok.
Ну и пример к ней из MSDN:

Example
// crt_strtok.c
/* In this program, a loop uses strtok
 * to print all the tokens (separated by commas
 * or blanks) in the string named "string".
 */

#include <string.h>
#include <stdio.h>

char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;

int main( void )
{
   printf( "Tokens:\n" );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}


Output
Tokens:
A
string
of
tokens
and
some
more
tokens


--
aga
Posted via RSDN NNTP Server 1.7 "Bedlam"

Исправлено форматирование. -- ПК
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.