diff --git a/others/vlad`s/lab1/task11.cpp b/others/vlad`s/lab1/task11.cpp index 3076b2d..b52a420 100644 --- a/others/vlad`s/lab1/task11.cpp +++ b/others/vlad`s/lab1/task11.cpp @@ -1,10 +1,9 @@ -// Task 11: In every pair of identical adjacent characters, replace the second with a space. -// Usage: ./task11 -> writes ".out" and prints replacements count. - #include #include #include #include +#include +#include static bool file_exists(const std::string &path) { struct stat st{}; @@ -17,13 +16,30 @@ static std::string make_out_name(const std::string &in) { 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[]) { - if (argc != 2) { - std::cerr << "Usage: " << argv[0] << " \n"; + if (argc != 3) { + std::cerr << "Usage: " << argv[0] << " input_file replace_count\n"; return -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)) { std::cerr << "Error: input file does not exist.\n"; return -1; @@ -46,15 +62,13 @@ int main(int argc, char *argv[]) { std::string line; while (std::getline(in, line)) { - if (!line.empty()) { - for (std::size_t i = 1; i < line.size(); ++i) { + if (!line.empty() && replacements < target) { + for (std::size_t i = 1; i < line.size() && replacements < target; ++i) { if (line[i] == line[i - 1]) { if (line[i] != ' ') { line[i] = ' '; ++replacements; } - // Move to next position; overlapping pairs like "aaa": - // i at 2 will compare line[2] with line[1] (now space) → no double count. } } } @@ -66,6 +80,16 @@ int main(int argc, char *argv[]) { } } + if (!in.eof() && in.fail()) { + 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 static_cast(replacements); + return 0; }