Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * dict1.c -- программа чтения словаря и печати словарной статьи по номеру
- *
- * Copyright (c) 2019, Nikita Semenov <ndsemeno@cs.karelia.ru>
- *
- * This code is licensed under a MIT-style license
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- #define MAXLINE 1023
- void show_entries(const char *pattern, FILE *dict);
- int main(int argc, char *argv[])
- {
- /* Файл словаря */
- FILE *dict = NULL;
- /* Открываем файл словаря и проверяем успешность открытия */
- dict = fopen(argv[1], "r");
- if (dict == NULL) {
- fprintf(stderr, "Невозможно открыть файл \n");
- exit(EXIT_FAILURE);
- }
- /* Считываем шаблон для поиска */
- char pattern[MAXLINE + 1] = "";
- printf("Введите шаблон \n");
- scanf("%s", pattern);
- show_entries(pattern, dict);
- fclose(dict);
- return 0;
- }
- void show_entries(const char *pattern, FILE *dict)
- {
- /* Текущая строка */
- char current_line[MAXLINE + 1] = "";
- /* Вычисляем длину шаблона */
- int len = strlen(pattern);
- /* Проверка шаблона на модификатор */
- int ptrn_mode = 0, tmp = 0, k = 0;
- int i, j, cnt;
- if (pattern[0] == '^') {
- ptrn_mode = 1;
- tmp = 1;
- }
- if ((pattern[len - 1] == '$') & (pattern[0] != '^')) {
- ptrn_mode = 2;
- tmp = 1;
- k = 1;
- }
- if ((pattern[0] == '^') & (pattern[len - 1] == '$')) {
- ptrn_mode = 3;
- tmp = 1;
- len--;
- }
- /* Просматриваем словарь, печатая строки удовлетворяющие шаблону */
- while (fgets(current_line, MAXLINE, dict) != NULL) {
- /* Возвращение переменных к начальному значению */
- i = 0;
- cnt = 0;
- j = tmp - k;
- /* Проверка на начало новой статьи */
- if (!isspace(current_line[0])) {
- /* Цикл идет пока i-ый символ строки не символ перевода строки или символ шаблона - $ */
- while ((current_line[i] != '\n') & (pattern[j] != '$')) {
- /* Если соответствующие символы шаблона и строки одинаковы */
- if (current_line[i++] == pattern[j]) {
- cnt++;
- j++;
- /* Проверка числа успешных совпадений и длины шаблона */
- if (cnt == (len - tmp)) {
- /* Действия при обычном шаблоне */
- if (ptrn_mode == 0) {
- printf("%s", current_line);
- break;
- }
- /* Действия при шаблоне для поиска начала */
- if ((ptrn_mode == 1) & ((i + 1) == len)) {
- printf("%s", current_line);
- break;
- }
- /* Действия при шаблоне для поиска конца */
- if ((ptrn_mode == 2) & (current_line[i] == '\n')) {
- printf("%s", current_line);
- break;
- }
- /* Действия при шаблоне для точного поиска с обоих концов */
- if ((ptrn_mode == 3) & (current_line[i] == '\n') & ((i + 1) == len)) {
- printf("%s", current_line);
- break;
- }
- }
- /* Если соответсвующие символы не равны */
- } else {
- /* Проверка на случай, при котором первая буква шаблона равна
- * i-ой букве строки, причем эти буквы повторяются
- */
- if (pattern[0] == current_line[i - 1]) {
- cnt = 1;
- j++;
- } else {
- cnt = 0;
- j = tmp - k;
- }
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement