Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661

Пригодность класса string для выделения слов текста

09.04.2011, 20:31. Показов 2786. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вроде сначала кажется, что класс basic_string (string) из
std <string> имеет мощные функции. Однако попытка применить его
к задаче разбиения строки на слова мне не вполне удается.
Аж 2 реализации функции split разделения строки на слова
обладают общим недостатками.
1)работают только по 1 разделителю, например пробел,точка, зпт
а не по нескольким
2)указание в качестве разделителя пробела нарушает корректность работы функций
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
vector<string> split(string s,char c)
{
  vector<string> res;
  int i=0,j = s.find(c);
  while(j >= 0)
  {
    if (s[i] != c) res.push_back(s.substr(i,j-i));
    i = ++j;
    j = s.find(c,j);
  }
  res.push_back(s.substr(i));
  return res;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef vector<string> StringList;
 StringList split( const string sep, const string str,bool allowEmptyEntries )
 {
 StringList lst; int j = 0;
 int i = str.find(sep, j );
      while ( i != -1 ) 
    {
      if ( i > j && i <= (int)str.length() )
      lst.push_back( str.substr( j, i - j ) );
      else if ( allowEmptyEntries ) lst.push_back( "" );
      j = i + sep.length();
      i = str.find( sep, sep.length() > 0 ? j : j+1 );
     }
      int l = str.length() - 1;
      if ( str.substr( j, l - j + 1 ).length() > 0 )
          lst.push_back( str.substr( j, l - j + 1 ) );
      else if ( allowEmptyEntries ) lst.push_back( "" );
      return lst;
      }
Видимо проблема в методе find
Подумал, подумал и ... на фига мне такой класс.
Лучше работать по старинке с strtok и string.h на уровне
языка C а не C++
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2011, 20:31
Ответы с готовыми решениями:

Нужно привести процедуру выделения слов из текста в рабочий вид
Как-то запутался и не могу по нормальному переделать, если можно ответ кодом. кто дано допишет? (без мемо както можно обойтись?) ...

Макрос для снятия выделения текста
Помогите написать макрос для того, чтобы убрать выделение текста. То есть когда выделяешь текст после использования другого макроса, то...

Скрипт для выделения текста цветом
Добрый день. У меня есть следующий код, который выделяет текст цветом после его выделения мышью: function selectText(hexColor) { ...

7
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
09.04.2011, 21:02
Может, дело не в классе?
C++
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
30
31
32
33
34
35
36
vector<string> tokenize(const string& str, const string& delimiters)
{
    vector<string> tokens;
    size_type delimPos = 0, tokenPos = 0, pos = 0;
 
    if (str.length() < 1)  return tokens;
    while (true)
    {
        delimPos = str.find_first_of(delimiters, pos);
        tokenPos = str.find_first_not_of(delimiters, pos);
 
        if (string::npos != delimPos)
        {
            if (string::npos != tokenPos)
            {
                if (tokenPos < delimPos)
                    tokens.push_back(str.substr(pos, delimPos - pos));
                else
                    tokens.push_back("");
            }
            else
                tokens.push_back("");
 
            pos = delimPos + 1;
        }
        else
        {
            if (string::npos != tokenPos)
                tokens.push_back(str.substr(pos));
            else
                tokens.push_back("");
            break;
        }
    }
    return tokens;
}
1
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
09.04.2011, 21:45  [ТС]
Спасибо, конечно за код. Он лучше работает чем то что я дал, т.к. позволяет в строке задать несколько разделителей. Но пробел (главный разделитель слов) и эта прога не отлавливает
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
09.04.2011, 22:34
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void split(std::vector<std::string>& v, const std::string& s, const std::string& delim)
{
    std::string::size_type first = 0;
    std::string::size_type last = 0;
 
    while( (first = s.find_first_not_of(delim, last)) != std::string::npos )
    {
        if( (last = s.find_first_of(delim, first) ) != std::string::npos )
            v.push_back( s.substr(first, last - first) );
        else
            v.push_back( s.substr(first, s.length() - first) );
    }
}
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
10.04.2011, 00:38  [ТС]
но все таки неясна причина почему при задании
C++
1
 sep=" ";//delimeter=" "; или скажем sep=" .,";
ни одна из 3 функций не делит строку на слова, а завершается при 1-м же наличии пробела в строке
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.04.2011, 01:14
Цитата Сообщение от eugrita Посмотреть сообщение
ни одна из 3 функций не делит строку на слова, а завершается при 1-м же наличии пробела в строке
http://codepad.org/S81XLZmR
Как видишь всё прекрасно работает.
0
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 661
10.04.2011, 09:52  [ТС]
Cпасибо всем. Проблема у меня а не у вас, т.к строку я не задаю а ввожу с консоли
C++
1
2
3
string str;
cout<<"Enter predl"<<endl;
cin>>str;
но потоковый ввод прекращается после 1-го пробела.
Как правильно ввести с консоли строку с пробелами в строку string?
cin.getline(str) не катит т.к не сhar*
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.04.2011, 10:38
Вот так:
C++
1
std::getline(std::cin, str);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2011, 10:38
Помогаю со студенческими работами здесь

Команда для выделения текста (как маркером)
Для назначения горячей клавиши. Вопрос пустяковый, конечно. Но я потратил минут 30 в поисках этой команды. Очень утомительно. А...

Регулярное выражение для выделения слов, начинающихся с заглавной буквы
Составить регулярное выражение, позволяющее выделить в тексте cлова, начинающиеся с Заглавной буквы, но не состоящие только из ЗАГЛАВНЫХ...

Разработать сканер для выделения лексем из строки текста
Ребят, привет!!! :)Помогите мне пожалуйста... Срочно нужна ваша помощь.:wall: Мне нужно разработать программу – сканер для выделения...

Есть ли в ListBox функция для выделения части текста и переноса в edit
есть ли в listbox функция для выделения части текста и переноса в edit. например есть файл с ФИО между ними стоят запятые, и мне нужно...

Как прописать цикл foreach для чтения и выделения текста в richTextBox?
Есть код: try { string str1 = richTextBox1.Lines.ToArray(); for (int i =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru