Родитель
fdbf740908
Сommit
eb30fae49d
@ -0,0 +1,121 @@
|
||||
#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;
|
||||
}
|
Загрузка…
Ссылка в новой задаче