Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
1

Есть ли в классе строк или в алгоритмах разбиение строку на лексемы?

12.07.2010, 05:49. Просмотров 1198. Ответов 3
Метки нет (Все метки)

Собственно сабж, как говорится. Хотел переписать программу, которую делал с Си строками и массивом Си строк. Сделана она была не совсем правильно, ибо там логичнее было использовать двумерный массив, но все же. Вот переписал с использованием string. Только долго пришлось маяться. Искал какую-нибудь функцию, чтобы не переводить в Си строку для разбиения на слова. Есть ли такие стандартные функции в стл? П.С. собственно сама программа. Можно ли написать короче?

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdlib>
int main()
{
    std::string BaseString;
    std::vector<std::string> ArrString;
    std::cout<<"Enter string\n";
    std::getline(std::cin, BaseString);
    std::cout<<BaseString<<'\n';
    char*p;
    p=strtok((char*)BaseString.c_str(), ",. :!?");
    if(p)
    {
        ArrString.push_back(p);
        
    }
    while(p!=0)
    {
        p=strtok(0,",. :!?");
        if(p)
        {
            ArrString.push_back(p);
        }
    }
    std::vector<std::string>::iterator s=ArrString.begin();
    while(s!=ArrString.end())
    {
        std::cout<<*s<<'\n';
        s++;
    }
    int i=0;
    size_t max=ArrString[i].size();
    s=ArrString.begin();
    while(s!=ArrString.end())
    {
        if(ArrString[i].size()>max)
            max=ArrString[i].size();
        s++;
        i++;
    }
    i=0;
    s=ArrString.begin();
    while(s!=ArrString.end())
    {
        if(ArrString[i].size()==max)
            std::cout<<"Word with max lenght is: "<< *s <<'\n';
        s++;
        i++;
    }
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2010, 05:49
Ответы с готовыми решениями:

Разбиение на лексемы
Нужно написать программу, запрашивающую строку текста, разбивающую ее на...

Разбиение кода на лексемы
Добрый день. Интересует такой вопрос. Какие средства могут помочь при написании...

Разделение строки на лексемы с strtok, проверка длины каждой лексемы (выдает ошибку)
я именно вот разделяю строку на лексемы и хочу проверить длину каждой лексемы,...

Разделить строку типа string на лексемы
Есть строка string, нужно разбить её на лексемы. У меня не получается...

Разбивка на лексемы и состовление из лексем строк
Мне уже пользователи форума уже помогли. Ну есть еще маленькая проблема. Стоит...

3
Nameless One
Эксперт С++
5786 / 3435 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
12.07.2010, 06:36 2
Лучший ответ Сообщение было отмечено как решение

Решение

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
#include <iostream>
#include <fstream>
#include <deque>
#include <sstream>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::string str("An international edition was released on August 9, 2005, published by Drakkar, with a different track listing");
    std::string punct(",!.:?");
    size_t index;
    //Меняем встретившиеся знаки препинания на пробелы
    while((index=str.find_first_of(punct))!=std::string::npos)
        str[index]=' ';
    std::stringstream ss(str);
    std::deque<std::string> dq;
    std::string temp;
    while(ss >> temp)
        dq.push_back(temp);
    std::copy(dq.begin(), dq.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    system("pause");
    return EXIT_SUCCESS;
}
Добавлено через 1 минуту
PS. Класс string имеет необходимые методы для работы со строками, так что в строки C переводить ничего не надо.
4
easybudda
Модератор
Эксперт CЭксперт С++
10113 / 6019 / 1510
Регистрация: 25.07.2009
Сообщений: 11,408
12.07.2010, 12:26 3
Nameless One, я как-то даже тему создавал про то, как бы это стандартными методами в С++ строку по разным разделителям поделить, а вот поменять их на один единственный не догадался... Спасибо!
0
ForEveR
В астрале
Эксперт С++
7996 / 4755 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.07.2010, 16:25  [ТС] 4
Спасибо большое.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2010, 16:25

Строка: Добавить в строковый класс функцию, которая создает строку, содержащую пересечение двух строк, то есть общие символы для двух строк.
Добавить в строковый класс функцию, которая создает строку, содержащую...

парсинг строк, разбиение строки на лексемы, регулярные выражения, разделители
недавно столкнулся с небольшой проблемой, необходимо выполнить казалось бы...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru