Удалить '4.cpp'
Этот коммит содержится в:
135
4.cpp
135
4.cpp
@@ -1,135 +0,0 @@
|
||||
#include <iostream>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <cctype>
|
||||
#include <cstdlib>
|
||||
#include <clocale> // для setlocale
|
||||
|
||||
const size_t MAX_SIZE = 256;
|
||||
const char* separators = " \r\n,.!?:;()-"; // Разделители для слов
|
||||
|
||||
// Функция для разделения строки на слова и их вывода
|
||||
void printWords(const char* text) {
|
||||
const char* start = text;
|
||||
|
||||
while (true) {
|
||||
// Пропускаем разделители в начале строки
|
||||
size_t separator_count = strspn(start, separators);
|
||||
start += separator_count;
|
||||
|
||||
// Если строка закончилась, выходим
|
||||
if (start[0] == '\0') {
|
||||
break;
|
||||
}
|
||||
|
||||
// Находим длину первого слова
|
||||
size_t word_length = strcspn(start, separators);
|
||||
|
||||
// Печатаем слово
|
||||
std::cout.write(start, word_length);
|
||||
std::cout << std::endl;
|
||||
|
||||
// Сдвигаем указатель на начало следующего слова
|
||||
start += word_length;
|
||||
}
|
||||
}
|
||||
|
||||
// Функция для проверки имени файла на корректность
|
||||
bool isValidFileName(const char* fileName) {
|
||||
const char* forbiddenChars = "*\"<>?|";
|
||||
if (strpbrk(fileName, forbiddenChars)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* colon = strchr(fileName, ':');
|
||||
if (colon) {
|
||||
if (colon != fileName + 1 || !isalpha(fileName[0])) {
|
||||
return false;
|
||||
}
|
||||
if (*(colon + 1) != '\\') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const char* ext = strrchr(fileName, '.');
|
||||
if (ext && _stricmp(ext, ".txt") != 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Функция для подсчета вхождений строки в тексте
|
||||
int countOccurrences(const char* text, const char* searchStr) {
|
||||
int count = 0;
|
||||
const char* p = text;
|
||||
while ((p = strstr(p, searchStr)) != nullptr) {
|
||||
count++;
|
||||
p += strlen(searchStr); // Перемещаем указатель на следующий символ после найденного
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
int main() {
|
||||
// Устанавливаем локаль для корректного отображения текста
|
||||
setlocale(LC_ALL, "Russian");
|
||||
|
||||
// 4.1 Запрос имени файла
|
||||
char fileName[MAX_SIZE];
|
||||
std::cout << "Введите имя файла: ";
|
||||
std::cin.getline(fileName, MAX_SIZE);
|
||||
|
||||
// 4.2 Проверка корректности имени файла
|
||||
while (!isValidFileName(fileName)) {
|
||||
std::cout << "Некорректное имя файла. Введите заново: ";
|
||||
std::cin.getline(fileName, MAX_SIZE);
|
||||
}
|
||||
|
||||
// 4.3 Добавление расширения ".txt", если его нет
|
||||
if (!strrchr(fileName, '.')) {
|
||||
strcat_s(fileName, MAX_SIZE, ".txt");
|
||||
}
|
||||
|
||||
// 4.4 Открытие файла и загрузка его содержимого
|
||||
FILE* file = nullptr;
|
||||
if (fopen_s(&file, fileName, "rb") != 0) {
|
||||
perror("Ошибка при открытии файла");
|
||||
return 1;
|
||||
}
|
||||
|
||||
fseek(file, 0, SEEK_END);
|
||||
size_t fileSize = ftell(file); // Изменили на size_t для совместимости с большим размером
|
||||
fseek(file, 0, SEEK_SET);
|
||||
|
||||
char* content = (char*)malloc(fileSize + 1);
|
||||
if (content == nullptr) {
|
||||
perror("Ошибка выделения памяти");
|
||||
fclose(file);
|
||||
return 1;
|
||||
}
|
||||
|
||||
fread(content, sizeof(char), fileSize, file);
|
||||
content[fileSize] = '\0'; // Завершающий нуль
|
||||
fclose(file);
|
||||
|
||||
// 4.5 Запрос строки для поиска
|
||||
char searchStr[MAX_SIZE];
|
||||
std::cout << "Введите строку для поиска: ";
|
||||
std::cin.getline(searchStr, MAX_SIZE);
|
||||
|
||||
// 4.6 Подсчет вхождений строки в тексте
|
||||
int occurrences = countOccurrences(content, searchStr);
|
||||
std::cout << "Строка '" << searchStr << "' встречается " << occurrences << " раз(а) в файле." << std::endl;
|
||||
|
||||
// 4.7 Освобождение памяти
|
||||
free(content);
|
||||
|
||||
// Дополнительно: Разделение строки на слова
|
||||
std::cout << "\n--- Разделение строки на слова ---\n";
|
||||
char text[MAX_SIZE];
|
||||
std::cout << "Введите строку для разделения на слова: ";
|
||||
std::cin.getline(text, MAX_SIZE);
|
||||
printWords(text);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Ссылка в новой задаче
Block a user