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

Обработка структурированного текста

20.12.2019, 16:43. Показов 300. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста укоротить код (объединить некоторые функции). Никак не могу придумать как написать иначе, а такую длину кода не принимают у меня...

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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#include <stdbool.h>
#include <string.h>
 
#define BUFFER 30 // one word length
#define TOTAL 10000 // words amount
 
void cpystr(char *array1, char *array2){
  int i = 0;
  for (i = 0; i < array2[i] != '\0'; i++) {
    array1[i] = array2[i];
  }
  array1[i] = '\0';
}
 
bool opened_tag_checker(char current_tag[BUFFER]){
  regex_t temp;
  regmatch_t pmatch[1];
  regcomp(&temp, "^<[^/][^>/]*>$", REG_EXTENDED);
  if (regexec(&temp, current_tag, 1, pmatch , 0) == 0)
  {
    regfree(&temp);
    return true;
  }
  else{
    regfree(&temp);
    return false;
  }
}
 
bool closed_tag_checker(char current_tag[BUFFER]){
  regex_t temp;
  regmatch_t pmatch[1];
  regcomp(&temp, "^</[^>]*>$", REG_EXTENDED);
  if (regexec(&temp, current_tag, 1, pmatch , 0) == 0)
  {
    regfree(&temp);
    return true;
  }
  else{
    regfree(&temp);
    return false;
  }
}
 
bool no_end_tag_checker(char current_tag[BUFFER]){
  regex_t temp;
  regmatch_t pmatch[1];
  regcomp(&temp, "^<[^/][^>]*/>$", REG_EXTENDED);
  if (regexec(&temp, current_tag, 1, pmatch , 0) == 0)
  {
    regfree(&temp);
    return true;
  }
  else{
    regfree(&temp);
    return false;
  }
}
 
bool find_tag(char input[TOTAL], int *start, int *end){
  regex_t temp;
  regmatch_t pmatch[1];
  regcomp(&temp, "</?[^>]*/?>", REG_EXTENDED);
  if (regexec(&temp, input, 1, pmatch , 0) == 0)
  {
    *start = pmatch[0].rm_so;
    *end = pmatch[0].rm_eo-1;
    regfree(&temp);
    return true;
  }
  else{
    regfree(&temp);
    return false;
  }
}
 
void pop_substring(char *array1, char *array2, int start, int end){
  int temp_i = 0;
  for (int i = start; i < end+1; i++) {
    array1[temp_i] = array2[i];
    temp_i++;
  }
  array1[temp_i] = '\0';
  memmove(&array2[start], &array2[end + 1], strlen(array2) - start);
}
void get_tag_name(char *tag, char *tag_name){
  int size = 0;
  for (int i = 1; i < strlen(tag) - 1; i++) {
    if (tag[i] != '/') {
        tag_name[size] = tag[i];
        size++;
    }
  }
  tag_name[size] = '\0';
}
 
void get_tag_name_par(char *tag, char *tag_name){
  int size = 0;
  for (int i = 1; i < strlen(tag) - 1; i++) {
    if (i == 1 && tag[i] == '/') {}else{
      if (tag[i] == ' ') {
        break;
      }
      tag_name[size] = tag[i];
      size++;
    }
  }
  tag_name[size] = '\0';
}
 
 
void get_parameter_value(char char_value[BUFFER], char current_tag[BUFFER]){
  int start, end = 0;
  regex_t temp;
  regmatch_t pmatch[1];
  regcomp(&temp, "="[^"]*"", REG_EXTENDED);
  if (regexec(&temp, current_tag, 1, pmatch , 0) == 0)
  {
    start = pmatch[0].rm_so+2;
    end = pmatch[0].rm_eo-1;
    int size = 0;
    for (int i = start; i < end; i++) {
      char_value[size] = current_tag[i];
      size++;
    }
    char_value[size] = '\0';
    regfree(&temp);
  }
}
 
bool find_parameters(char current_tag[BUFFER], int *start, int *end){
  regex_t temp;
  regmatch_t pmatch[1];
  regcomp(&temp, " [^=]*="[^"]*"", REG_EXTENDED);
  if (regexec(&temp, current_tag, 1, pmatch , 0) == 0)
  {
    *start = pmatch[0].rm_so+1;
    *end = pmatch[0].rm_eo-1;
    regfree(&temp);
    return true;
  }
  else{
    regfree(&temp);
    return false;
  }
}
 
bool compair_tags(char *tag1, char *tag2){
  char tag1_name[BUFFER];
  get_tag_name(tag1, tag1_name);
  char tag2_name[BUFFER];
  get_tag_name(tag2, tag2_name);
  if (strcmp(tag1_name, tag2_name) == 0) {
    return true;
  }
  return false;
}
 
struct Variables{
  char var_name[TOTAL][BUFFER];
  int var_value[100];
  int var_count;
};
 
void load_file(char *array)
{
  char c;
  int size = 0;
  while (EOF != (c = fgetc(stdin))) {
    array[size] = c;
    size++;
  }
  array[size] = '\0';
}
int main(){
  char input[TOTAL];
  char tags_array[TOTAL][BUFFER];
  int start = 0;
  int end = 0;
  int size = 0;
  int tags_counter = 0;
  char stack[TOTAL][BUFFER];
  load_file(input);
  while (find_tag(input, &start, &end)) {
    pop_substring(tags_array[size], input, start, end);
    size++;
  }
  int stack_size = 0;
  struct Variables Variable;
  Variable.var_count = 0;
  for (int i = 0; i < size; i++) {
    char *current_tag = tags_array[i];
    if (no_end_tag_checker(current_tag)) {
      tags_counter++;
 
      if (find_parameters(current_tag, &start, &end)){
        char tag_name[BUFFER];
        get_tag_name_par(current_tag, tag_name);
 
        if (strcmp(tag_name, "add") == 0){
          char value[BUFFER];
          get_parameter_value(value, current_tag);
          Variable.var_value[Variable.var_count] += atoi(value);
        }else if(strcmp(tag_name, "sub") == 0){
          char value[BUFFER];
          get_parameter_value(value, current_tag);
          Variable.var_value[Variable.var_count] -= atoi(value);
        }
      }
    }
    if (opened_tag_checker(current_tag)) {
      cpystr(stack[stack_size], current_tag);
      stack_size++;
      tags_counter++;
 
      if (find_parameters(current_tag, &start, &end)){
        char tag_name[BUFFER];
        get_tag_name_par(current_tag, tag_name);
 
        if (strcmp(tag_name, "equation") == 0){
          char value[BUFFER];
          get_parameter_value(value, current_tag);
          cpystr(Variable.var_name[Variable.var_count], value);
          Variable.var_value[Variable.var_count] = 0;
        }
      }
    }
    if (closed_tag_checker(current_tag)){
      char temp[BUFFER];
      stack_size--;
      if (find_parameters(stack[stack_size], &start, &end)){
        pop_substring(temp, stack[stack_size], 0, start-1);
      }else{
        pop_substring(temp, stack[stack_size], 0, strlen(stack[stack_size])-1);
      }
      if (compair_tags(current_tag, temp) != true) {
        printf("текст валидный\n");
        return 100;
      }else{
        if (strcmp(temp, "<equation ") == 0){
          Variable.var_count++;
        }
      }
    }
  }
  if (stack_size != 0){
    printf("текст валидный\n");
    return 100;
  }
  for (int i = 0; i < Variable.var_count; i++) {
    printf("%s=%d\n", Variable.var_name[i], Variable.var_value[i]);
  }
  printf("количество тегов: %d\n", tags_counter);
  printf("текст валидный\n");
  return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.12.2019, 16:43
Ответы с готовыми решениями:

Анализ структурированного текста (XML)
Целью задачи является анализ структурированного текста (XML) в виде текстового файла общей длины на стандартном вводе программы. ...

Экспорт Структурированного Текста Документа
Друзья, добрый день! B) Прошу подсказать, как программно (предположительно через агент) реализовать экспорт структурированного текста для...

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.12.2019, 16:43
Помогаю со студенческими работами здесь

Ввод текста, обработка и вывод текста в то же поле
Здравствуйте!Как сделать в delphi 10 seattle нечто вроде экспертных систем?Вводим текст (типа как в консоли), обрабатываем его, и выводим...

Обработка текста - извлечение текста в кавычках
Доброго времени суток. У меня есть код void select(WideString FileName) { if (!(FileName.IsEmpty())) { TStringList * IN_SL =...

Удаление структурированного массива
Доброго времени суток, форумчане. Выделил память arr = new point; где point - это структура. Как удалить этот массив? delete arr;...

Чтение структурированного файла
Собственно сабж. Не знаю как реализовать - есть несколько dat файлов, разделённых на блоки по n байт, а структура этих блоков описывается в...

Чтение структурированного файла
Здравствуйте, подскажите как лучше прочитать структурированный файл. Спасибо.


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений в EXE. Здесь описаны базовые шаги для старта программирования с помощью CMake и MinGW. Для набора. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru