Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
90 строки
1.9 KiB
C++
90 строки
1.9 KiB
C++
#define _CRT_SECURE_NO_WARNINGS
|
|
#include <iostream>
|
|
#include <cstdio>
|
|
|
|
|
|
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);
|
|
}
|
|
using namespace std;
|
|
const size_t MAX_SIZE = 256;
|
|
const char not_allowed[] = "*\"<>?|";
|
|
const char separators[] = " \r\n,.!?:;()-";
|
|
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 != 2)
|
|
return false;
|
|
if (colon[1] != '\\')
|
|
return false;
|
|
if (strrchr(name, ':') != colon)
|
|
return false;
|
|
}
|
|
char *fname = strrchr(name, '\\');
|
|
fname = fname ? fname++ : 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() {
|
|
char filename[MAX_SIZE];
|
|
char str[MAX_SIZE];
|
|
cout << "Input file: ";
|
|
getstring(filename, MAX_SIZE);
|
|
if (iscorrectname(filename) == false) {
|
|
cout << "Entered not correct name\n";
|
|
return -1;
|
|
}
|
|
FILE *fin = fopen(filename, "rb");
|
|
if (fin == NULL) {
|
|
cout << "Can't open file\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 << "Input string: ";
|
|
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 << "Result: " << count << "\n";
|
|
fclose(fin);
|
|
delete text;
|
|
cin >> str;
|
|
return 0;
|
|
} |