Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
122 строки
3.3 KiB
Plaintext
122 строки
3.3 KiB
Plaintext
#define _CRT_SECURE_NO_WARNINGS
|
|
#include <iostream>
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#include <cctype>
|
|
#include <locale>
|
|
|
|
using namespace std;
|
|
|
|
const size_t MAX_SIZE = 256;
|
|
const char not_allowed[] = "*\"<>?|";
|
|
const char separators[] = " \r\n,.!?:;()-";
|
|
|
|
// Функция для получения строки с пользовательским вводом
|
|
void getstring(char* s, size_t n) {
|
|
fgets(s, n, stdin);
|
|
if (s[strlen(s) - 1] == '\n')
|
|
s[strlen(s) - 1] = '\0';
|
|
}
|
|
|
|
// Функция для перевода строки в нижний регистр
|
|
void lower(char* s) {
|
|
for (; *s; s++)
|
|
*s = tolower(*s);
|
|
}
|
|
|
|
// Функция для проверки корректности имени файла
|
|
bool iscorrectname(char* name) {
|
|
char lext[8];
|
|
|
|
// Проверка на наличие запрещенных символов
|
|
for (int i = 0; name[i]; i++) {
|
|
if (strchr(not_allowed, name[i]) != 0)
|
|
return false;
|
|
}
|
|
|
|
// Проверка корректности двоеточия и пути
|
|
char* colon = strchr(name, ':');
|
|
if (colon != NULL) {
|
|
if (colon - name != 1)
|
|
return false;
|
|
if (colon[1] != '\\')
|
|
return false;
|
|
if (strrchr(name, ':') != colon)
|
|
return false;
|
|
}
|
|
|
|
// Проверка и добавление расширения .txt
|
|
char* fname = strrchr(name, '\\');
|
|
fname = fname ? fname + 1 : name;
|
|
char* ext = strchr(fname, '.');
|
|
if (ext == NULL)
|
|
strcat(name, ".txt");
|
|
else {
|
|
strcpy(lext, ext);
|
|
lower(lext);
|
|
if (strcmp(lext, ".txt"))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int main() {
|
|
setlocale(LC_ALL, "rus");
|
|
|
|
char filename[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
|
|
cout << "Название файла: ";
|
|
getstring(filename, MAX_SIZE);
|
|
|
|
// Проверка имени файла
|
|
if (!iscorrectname(filename)) {
|
|
cout << "Некорректное название файла\n";
|
|
return -1;
|
|
}
|
|
|
|
// Открытие файла
|
|
FILE* fin = fopen(filename, "rb");
|
|
if (fin == NULL) {
|
|
cout << "Файл не найден\n";
|
|
return -1;
|
|
}
|
|
|
|
// Определение размера файла
|
|
fseek(fin, 0, SEEK_END);
|
|
size_t length = ftell(fin);
|
|
fseek(fin, 0, SEEK_SET);
|
|
|
|
// Чтение содержимого файла в память
|
|
char* text = new char[length + 1];
|
|
memset(text, 0, length + 1);
|
|
fread(text, 1, length, fin);
|
|
|
|
cout << "Введите символы для подсчёта: ";
|
|
getstring(str, MAX_SIZE);
|
|
|
|
// Подсчет вхождений строки
|
|
const char* start = text;
|
|
size_t count = 0;
|
|
while (true) {
|
|
const size_t separator_count = strspn(start, separators);
|
|
start += separator_count;
|
|
if (start[0] == '\0') {
|
|
break;
|
|
}
|
|
const size_t word_length = strcspn(start, separators);
|
|
if (word_length == strlen(str) && strncmp(str, start, word_length) == 0) {
|
|
count++;
|
|
}
|
|
start += word_length;
|
|
}
|
|
|
|
cout << "Результат: " << count << "\n";
|
|
|
|
// Освобождение памяти и закрытие файла
|
|
fclose(fin);
|
|
delete[] text;
|
|
|
|
return 0;
|
|
}
|