Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

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;
}