kirill works

This commit is contained in:
2025-10-01 19:55:57 +07:00
parent 9dd5c95ced
commit 623a49127e

View File

@@ -2,6 +2,8 @@
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <sys/stat.h> #include <sys/stat.h>
#include <cstdlib>
#include <cerrno>
static bool file_exists(const std::string &path) { static bool file_exists(const std::string &path) {
struct stat st{}; struct stat st{};
@@ -14,13 +16,30 @@ static std::string make_out_name(const std::string &in) {
return in.substr(0, pos) + ".out"; return in.substr(0, pos) + ".out";
} }
static bool parse_nonneg_ll(const char *s, long long &out) {
if (!s || *s == '\0') return false;
char *end = nullptr;
errno = 0;
long long v = std::strtoll(s, &end, 10);
if (errno != 0 || end == s || *end != '\0') return false;
if (v < 0) return false;
out = v;
return true;
}
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
if (argc != 2) { if (argc != 3) {
std::cerr << "Usage: " << argv[0] << " <input_file>\n"; std::cerr << "Usage: " << argv[0] << " input_file replace_count\n";
return -1; return -1;
} }
std::string in_path = argv[1]; std::string in_path = argv[1];
long long target = 0;
if (!parse_nonneg_ll(argv[2], target)) {
std::cerr << "Usage: " << argv[0] << " input_file replace_count\n";
return -1;
}
if (!file_exists(in_path)) { if (!file_exists(in_path)) {
std::cerr << "Error: input file does not exist.\n"; std::cerr << "Error: input file does not exist.\n";
return -1; return -1;
@@ -43,10 +62,10 @@ int main(int argc, char *argv[]) {
std::string line; std::string line;
while (std::getline(in, line)) { while (std::getline(in, line)) {
if (!line.empty()) { if (!line.empty() && replacements < target) {
for (std::size_t idx = 0; idx < line.size(); ++idx) { for (std::size_t idx = 0; idx < line.size() && replacements < target; ++idx) {
std::size_t pos1 = idx + 1; std::size_t pos1 = idx + 1;
if (pos1 % 3 == 0) { if ((pos1 % 3) == 0) {
if (line[idx] != ' ') { if (line[idx] != ' ') {
line[idx] = ' '; line[idx] = ' ';
++replacements; ++replacements;
@@ -62,6 +81,16 @@ int main(int argc, char *argv[]) {
} }
} }
std::cout << replacements << std::endl; if (!in.eof() && in.fail()) {
return static_cast<int>(replacements); std::cerr << "Error: read error.\n";
return -1;
}
if (replacements != target) {
std::cerr << "Error: could not perform exactly requested replacements.\n";
return -1;
}
std::cout << replacements << std::endl;
return 0;
} }