Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 16.12.2014
Сообщений: 12

Токенизация, разделение текста на слова

16.12.2014, 21:12. Показов 2669. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, по заданию необходимо

1.Прочитать текст из первого файла.
2.Выделить словоформы и вписать их в отдельный двумерный char ( столбиком), а также сохранить во втором файле.


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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream> 
#include <conio.h>
#include <locale>
#include <stdio.h>
 
int main()
{
    setlocale(LC_ALL, "russian");
    FILE *fin, *fout;
    char str[255];
    memset(str, 0, 255);
    fin = fopen("input.txt", "r+");
    fout = fopen("output.txt", "r+");
    fscanf(fin, "%s", str);
    
 
 
    
    fclose(fout);
    fclose(fin);
 
    _getch();
}
Для выделения слов, исключая символы можно ли использовать функцию strtok?

C++
1
2
3
4
5
6
7
 char * temp = strtok (str," ?,!.-"); 
 
  while (temp != NULL)
  {
      std::cout << temp  << "n";
      temp = strtok (NULL, " ?,!.-"); 
  }
Если можно использовать strtok, то как вписывать каждое слово до разделителя в отдельную строку первого столбца? используя обычный цикл for???


Никого не обязую писать весь код, или писать какой либо код вообще, прошу и жду ваших советов, они для меня сейчас очень важны и необходимы, заранее спасибо за ваше потраченное на меня время.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2014, 21:12
Ответы с готовыми решениями:

Разделение произвольного текста на слова
Пытаюсь разделить произвольный текст на отдельные слова. И присвоить каждое слово элементу структуры. Но когда программа проходит первую...

Разделение строки на слова, и поиск слова по определенным критериям
Вводиться строка, разделенная пробелами. Требуется отыскать слово, в котором гласных A,E,I,O максимальное количество.

Сортировка текста, разделение текста пробелами
Есть массив TextBox-ов TextBox tb; И CheckBox-ов CheckBox chb; Дальше инициализирую их private void Form1_Load(object sender,...

3
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.12.2014, 10:53
strtok() нужно использовать. В цикле очередной temp копируй в массив, нужен счётчик, разумеется.
1
0 / 0 / 0
Регистрация: 16.12.2014
Сообщений: 12
21.12.2014, 18:05  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
strtok() нужно использовать
Спасибо за отклик!

Попытался написать иначе,
все читает
удаляет символы,лишние пробелы
записывает в двумерный массив,

Посоветуй пожалуйста, как удалить из двумерного массива Arr_text слова из двумерного массива Arr_sw, не получается,у нас даже лекции не было по строкам... спасибо!

main
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "Functions.h"
 
 
using namespace std;
 
void main(void)
{
    
    const int stroka = 100; 
    const int stolbec = 20;
    const int memm = 1000;
 
    char Arr_text[stroka][stolbec];
    char Arr_sw[stroka][stolbec];
    char Arr_ok[stroka][stolbec];
    char Text[memm];
    char Sw[memm];
    char Okon[memm];
    setlocale(LC_ALL, "Russian");
 
 
    FILE *T; //копирование из файла в строку
    errno_t e;
    e = fopen_s(&T, "Text.txt", "r");
 
    FILE *Pr;
    errno_t err;
    err = fopen_s(&Pr, "Predlogi.txt", "r");
 
    FILE *Ok;
    errno_t p;
    p = fopen_s(&Ok, "Okon.txt", "r");
 
    memset(Text, ' ', memm);
    memset(Sw, ' ', memm);
    memset(Okon, ' ', memm);
    Read_line(T, Text);  //ЗАПИСЬ ТЕКСТА В СТРОКУ
    Read_line(Pr, Sw);   //ЗАПИСЬ СТОП-СЛОВ В СТРОКУ
    Read_line(Ok, Okon);  //ЗАПИСЬ ОКОНЧАНИЙ В СТРОКУ
 
    Delete_point(Text);
    Delete_space(Text);
    Delete_point(Sw);
    Delete_space(Sw);
    Delete_point(Okon);
    Delete_space(Okon);
    
    int len = 0;
 
    Pr_arr(Text, Arr_text, len);
    for (int i = 0; i < len; i++)
    {
        cout << Arr_text[i] << "\n";
    }
 
    Pr_arr(Sw, Arr_sw, len);
    for (int i = 0; i < len; i++)
    {
        cout << Arr_sw[i] << "\n";      
    }
    Pr_arr(Okon, Arr_ok, len);
    for (int i = 0; i < len; i++)
    {
        cout << Arr_ok[i] << "\n";
    }
    
    
 
 
 
    _getch();
}
функции

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <locale>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
using namespace std;
 
void Read_line(FILE *in, char Arr[]) //OK
{
    char Str[1000];
    Arr[0] = '/0';
    do
    {
        fgets(Str, 1000, in);
        strcpy_s(Arr, 1000, Str);
    } while (!feof(in));
}
 
 
 
void Pr_arr(char *str, char Arr[][20], int &len)
{
    int i;  // Для управления в Text
    int k = 0;  // Счетчик слов
    int j = 1;  // Для копирования
    for (i = 0; i<strlen(str); i++)
    {
        Arr[k][0] = ' ';
        if (str[i] != ' ')
        {
            Arr[k][j] = str[i];
            j++;
        }
        else
        {
            Arr[k][j] = ' ';
            Arr[k][j+1] = '\0';
            k++; 
            j = 1;
        }
    
    }
    len = k;
    
}
 
 
 
void Delete_point(char Str[])  //удаление знаков препинания   OK
{
    char Sum[] = "-.,!;?():\n";
    char *x;
    char *f;
    do
    {
        x = strpbrk(Str, Sum);
        if (x != NULL)
        {
            for (f = x; *f != '\0'; f++)
                *f = *(f + 1);
        }
    } while (x != NULL);
 
}
 
void Delete_space(char Str[]) //удаление лишних пробелов
{
    int i, k;
    for (i = 0; i<strlen(Str);)
        if (Str[i] == ' ' && Str[i + 1] == ' ')
            for (k = i + 1; k<strlen(Str); k++)
                Str[k] = Str[k + 1];
        else i++;
}
 
 
void Delete_s_w(char *Text, char Arr_sw[][15], int len)
{
    char *x=NULL;
    char *f=NULL;
    
        for (int i = 0; i < len; i++)
        {
            do
            {
                x = strstr(Text, Arr_sw[i]);
 
                if (x != NULL)
                {
                    
                    for (int k = 0; k<strlen(Arr_sw[i])-1; k++)
                    {
                        for (f = x; *f != '\0'; f++)
                            *f = *(f + 1);
                    }
                    f = " ";
                }
            } while (x!=NULL);
        }
    
}
 
 
//void Pr_ok(char *str, char Arr[][15], int &len)
//{
//  int i;  // Для управления в Text
//  int k = 0;  // Счетчик слов
//  int j = 0;  // Для копирования
//  
//  for (i = 0; i<strlen(str); i++)
//  {
//      if (str[i] != ' ')
//      {
//          Arr[k][j] = str[i];
//          j++;
//      }
//      else
//      {
//          Arr[k][j] = ' ';
//          Arr[k][j + 1] = '\0';
//          k++;
//          j = 0;
//      }
//
//  }
//  len = k;
//
//}
файл Text.txt
C++
1
Кутузов, сопутствуемый своими адъютантами, поехал шагом за карабинерами. Проехав с полверсты в хвосте колонны, он остановился у одинокого заброшенного дома (вероятно, бывшего трактира) подле разветвления двух дорог. Обе дороги спускались под гору, и по обеим шли войска. Туман начинал расходиться, и неопределенно, верстах в двух расстояния, виднелись уже неприятельские войска на противоположных возвышенностях. Налево внизу стрельба становилась слышнее. Кутузов остановился, разговаривая с австрийским генералом. Князь Андрей, стоя несколько позади, вглядывался в них и, желая попросить зрительную трубу у адъютанта, обратился к нему.
файл
predlogi.txt

C++
1
из на за под в с о без для и или по через между которое которая который которых не так что от как при к у подле позади
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.12.2014, 10:54
Нужно сохранять количество элементов для всех трёх массивов в отдельные переменные. У тебя Pr_arr() через третий параметр возвращает длину, но в основной программе общая переменная len, а нужно отдельно для каждого из трёх массивов хранить.
Что касается удаления. Проще, наверное, просто обнулять строку (делать пустой), чтобы не заниматься сдвигом всех элементов в массиве при каждом удалении. Используй циклы и strcmp() для поиска.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.12.2014, 10:54
Помогаю со студенческими работами здесь

Напечатать слова, которые отличны от последнего слова текста, предварительно удалив из слова последнюю букву
Дана последовательность содержащая от 1 до 30 слов, в каждом из которых от 1 до 5 строчных латинских букв; между соседними словами не менее...

Напечатать слова текста в таком порядке, чтобы последняя буква каждого слова совпадала с первой буквойпоследующего слова
В тексте не слов, начинающихся одинаковыми буквами. Напечатать слова текста в таком порядке, чтобы последняя буква каждого слова совпадала...

Вывести слова текста, которые отличны от первого слова и первая буква слова входит в него ещё раз
Дан текст, содержащий от 2 до 50 слов, в каждом из которых от 1 до 8 строчных латинских букв; между соседними словами – не менее одного...

Разделение текста
Есть строка &quot;site.com;login;password&quot; Как это разделить на 3 разных переменных?

Разделение текста
Приветствую Нужна помощь.У меня есть memo1 куда вставляются емаилы и пароли в виде email;passworld Мне надо получить емаил и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
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