Постановка задачи: В заданной строке заменить три точки, идущие подряд, тремя первыми символами строки.
Алгоритм решения: Если строка не начинается с троеточия, последовательно заменять все его вхождения.
Тесты
Input |
Output |
the more I code … better my coding becomes |
the more I code the better my coding becomes |
…what am I supposed to do? |
…what am I supposed to do? |
abc……… |
abcabcabc |
Код программы
1. C, c-string,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char* argv[]){ if(argc){ //если при вызове функции ей были переданы аргументы unsigned i, size = 0; for(i = 1; i < argc; i++) size += strlen(argv[i]); char* s = (char*) malloc(size + 1); //выделение памяти под строку for(i = 1; i < argc; i++) //заполнение строки strcat(s, argv[i]); char replacer[3] = {s[0], s[1], s[2]}; //первые три символа строки char *pch; //указатель на адрес первого вхождения подстроки //если строка содержит хотя бы одно троеточие и не начинается с него while((pch = strstr(s, "...")) - s < strlen(s) && pch - s ≥ 3) strncpy(pch, replacer, 3); printf("%s\n", s); } return 0; } |
2. C++, string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
#include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]){ if(argc){ string s; for(int i = 1; i < argc; i++) s += argv[i]; unsigned found = -1; //позиция вхождения подстроки string replacer = s.substr(0, 3); //первые три символа строки //если строка содержит хотя бы одно троеточие и не начинается с него while((found = s.find("...")) < s.size() && found ≥ 3) s.replace(found, 3, replacer); cout << s << endl; } return 0; } |
Related Images: