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

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

16.12.2014, 21:12. Показов 2607. Ответов 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
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru