Advertisement
blazinghorizon

Untitled

Nov 4th, 2019
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.66 KB | None | 0 0
  1. /*
  2.  * dict1.c -- программа чтения словаря и печати словарной статьи по номеру
  3.  *
  4.  * Copyright (c) 2019, Nikita Semenov <ndsemeno@cs.karelia.ru>
  5.  *
  6.  * This code is licensed under a MIT-style license
  7.  */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #define MAXLINE 1023
  14.  
  15. void show_entries(const char *pattern, FILE *dict);
  16.  
  17. int main(int argc, char *argv[])
  18. {
  19.     /* Файл словаря */
  20.     FILE *dict = NULL;
  21.  
  22.     /* Открываем файл словаря и проверяем успешность открытия */
  23.     dict = fopen(argv[1], "r");
  24.     if (dict == NULL) {
  25.         fprintf(stderr, "Невозможно открыть файл \n");
  26.         exit(EXIT_FAILURE);
  27.     }
  28.  
  29.     /* Считываем шаблон для поиска */
  30.     char pattern[MAXLINE + 1] = "";
  31.     printf("Введите шаблон \n");
  32.     scanf("%s", pattern);
  33.  
  34.     show_entries(pattern, dict);
  35.  
  36.     fclose(dict);
  37.     return 0;
  38. }
  39.  
  40. void show_entries(const char *pattern, FILE *dict)
  41. {
  42.     /* Текущая строка */
  43.     char current_line[MAXLINE + 1] = "";
  44.  
  45.     /* Вычисляем длину шаблона */
  46.     int len = strlen(pattern);
  47.  
  48.     /* Проверка шаблона на модификатор */
  49.  
  50.     int ptrn_mode = 0, tmp = 0, k = 0;
  51.     int i, j, cnt;
  52.  
  53.     if (pattern[0] == '^') {
  54.         ptrn_mode = 1;
  55.         tmp = 1;
  56.     }
  57.  
  58.     if ((pattern[len - 1] == '$') & (pattern[0] != '^')) {
  59.         ptrn_mode = 2;
  60.         tmp = 1;
  61.         k = 1;
  62.     }
  63.  
  64.     if ((pattern[0] == '^') & (pattern[len - 1] == '$')) {
  65.         ptrn_mode = 3;
  66.         tmp = 1;
  67.         len--;
  68.     }
  69.  
  70.     /* Просматриваем словарь, печатая строки удовлетворяющие шаблону */
  71.  
  72.     while (fgets(current_line, MAXLINE, dict) != NULL) {
  73.         /* Возвращение переменных к начальному значению */
  74.         i = 0;
  75.         cnt = 0;
  76.         j = tmp - k;
  77.         /* Проверка на начало новой статьи */
  78.         if (!isspace(current_line[0])) {
  79.             /* Цикл идет пока i-ый символ строки не символ перевода строки или символ шаблона - $ */
  80.             while ((current_line[i] != '\n') & (pattern[j] != '$')) {
  81.                 /* Если соответствующие символы шаблона и строки одинаковы */
  82.                 if (current_line[i++] == pattern[j]) {
  83.                     cnt++;
  84.                     j++;
  85.                     /* Проверка числа успешных совпадений и длины шаблона */
  86.                     if (cnt == (len - tmp)) {
  87.                         /* Действия при обычном шаблоне */
  88.                         if (ptrn_mode == 0) {
  89.                             printf("%s", current_line);
  90.                             break;
  91.                         }
  92.                         /* Действия при шаблоне для поиска начала */
  93.                         if ((ptrn_mode == 1) & ((i + 1) == len)) {
  94.                             printf("%s", current_line);
  95.                             break;
  96.                         }
  97.                         /* Действия при шаблоне для поиска конца */
  98.                         if ((ptrn_mode == 2) & (current_line[i] == '\n')) {
  99.                             printf("%s", current_line);
  100.                             break;
  101.                         }
  102.                         /* Действия при шаблоне для точного поиска с обоих концов */
  103.                         if ((ptrn_mode == 3) & (current_line[i] == '\n') & ((i + 1) == len)) {
  104.                             printf("%s", current_line);
  105.                             break;
  106.                         }
  107.                     }
  108.                     /* Если соответсвующие символы не равны */
  109.                 } else {
  110.                     /* Проверка на случай, при котором первая буква шаблона равна
  111.                      * i-ой букве строки, причем эти буквы повторяются
  112.                      */
  113.                     if (pattern[0] == current_line[i - 1]) {
  114.                         cnt = 1;
  115.                         j++;
  116.                     } else {
  117.                         cnt = 0;
  118.                         j = tmp - k;
  119.                     }
  120.                 }
  121.             }
  122.         }
  123.     }
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement