fork(4) download
  1.  
  2. #include <stdio.h>
  3. size_t s_length(const char* s);
  4. void s_copy(char* d, const char* s, size_t n);
  5. void s_move(char* d, const char* s, size_t n);
  6.  
  7.  
  8. char* s_replace(char* s, const char* old,
  9. const char* ns, size_t maxsize){
  10. const char* p2;
  11. size_t n1, n2, n3, i;
  12. char* p1, *t = s;
  13.  
  14. n1 = s_length(old);
  15. n2 = s_length(ns) + 1;
  16. n3 = s_length(s) + 1;
  17. i = 0;
  18.  
  19. while(*s && (i < 9)){
  20. p1 = s;
  21. p2 = old;
  22. while(*p2 && (*p2 == *p1)){
  23. ++p1;
  24. ++p2;
  25. }
  26.  
  27. if(! *p2){
  28. if(n2 > n1){
  29.  
  30. //защита от переполнение выходного буфера
  31. if((n3 + (n2 - n1)) >= maxsize)
  32. break;
  33.  
  34. s_move(s + (n2 - n1), s, n3 - (size_t)(s - t));
  35. n3 += n2 - n1;
  36. } else {
  37. s_copy(s, s + (n1 - n2), n3 - (size_t)(s - t));
  38. n3 -= n1 - n2;
  39. }
  40.  
  41. s_copy(s, ns, n2);
  42. s += n2 - 1;
  43. *s++ = (char)(i + '1');
  44. ++i;
  45. continue;
  46. }
  47. ++s;
  48. }
  49. return t;
  50. }
  51.  
  52.  
  53. int main(void){
  54. char s[64] = "ПОЛИЛИ_ЛИЛИЮ";
  55. puts(s);
  56. puts(s_replace(s, "ЛИ", "СТО", sizeof(s) - 1));
  57. return 0;
  58. }
  59.  
  60.  
  61. size_t s_length(const char* s){
  62. const char* t = s;
  63. while(*s)
  64. ++s;
  65. return (size_t)(s - t);
  66. }
  67.  
  68. void s_copy(char* d, const char* s, size_t n){
  69. size_t i;
  70. for(i = 0; i < n; ++i)
  71. *d++ = *s++;
  72. }
  73.  
  74. void s_move(char* d, const char* s, size_t n){
  75. size_t i;
  76. d += (n - 1);
  77. s += (n - 1);
  78. for(i = n; i > 0; --i)
  79. *d-- = *s--;
  80. }
  81.  
Success #stdin #stdout 0s 2052KB
stdin
Standard input is empty
stdout
ПОЛИЛИ_ЛИЛИЮ
ПОСТО1СТО2_СТО3СТО4Ю