From 93f4d988397c1906b2903df9dbfc2f1ffe546064 Mon Sep 17 00:00:00 2001 From: etrushko05 Date: Sat, 18 Oct 2025 06:05:03 -0400 Subject: [PATCH] 13 --- str.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++--------- str.h | 1 + str_test | Bin 0 -> 25960 bytes 3 files changed, 72 insertions(+), 14 deletions(-) create mode 100755 str_test diff --git a/str.c b/str.c index 8036bd5..98ebaf0 100644 --- a/str.c +++ b/str.c @@ -28,7 +28,10 @@ void str_init(str *s) { assert(s); - // + s->len = 0; + s->capacity = INIT_SZ; + s->ptr = xmalloc(INIT_SZ); + s->ptr[0] = '\0'; } void @@ -37,64 +40,86 @@ str_deinit(str *s) if (s->ptr) free(s->ptr); s->ptr = NULL; + s->len = 0; + s->capacity = 0; } void str_init_data(str *s, const char *initial) { assert(s && initial); - // + int len = strlen(initial); + s->len = len; + s->capacity = len + 1; + s->ptr = xmalloc(s->capacity); + memcpy(s->ptr, initial, len + 1); } char * str_data(str *s) { assert(s); - // - return NULL; + return s->ptr; } void str_set(str *s, char *cstr) { assert(s && cstr); - // + int len = strlen(cstr); + _str_ensure(s, len); + memcpy(s->ptr, cstr, len + 1); + s->len = len; } str str_copy(str *s) { assert(s); - // + str new_str; + str_init_data(&new_str, s->ptr); + return new_str; } int str_count(str *s, char ch) { assert(s); - // - return 0; + int count = 0; + for (int i = 0; i < s->len; i++) { + if (s->ptr[i] == ch) { + count++; + } + } + return count; } void str_append(str *s, char *cstr) { assert(s && cstr); - // + int len = strlen(cstr); + str_append_n(s, cstr, len); } void str_append_n(str *s, char *cstr, int len) { assert(s && cstr); - // + _str_ensure(s, s->len + len); + memcpy(s->ptr + s->len, cstr, len); + s->len += len; + s->ptr[s->len] = '\0'; } void str_shrink(str *s, int len) { assert(s && len >= 0); - // + if (len < s->len) { + s->len = len; + s->ptr[s->len] = '\0'; + } } int @@ -114,7 +139,16 @@ str_sub(str *s, int start_idx, int length) str s2; str_init(&s2); - // + if (start_idx >= s->len) { + return s2; // пустая строка + } + + int actual_length = length; + if (start_idx + length > s->len) { + actual_length = s->len - start_idx; + } + + str_append_n(&s2, s->ptr + start_idx, actual_length); return s2; } @@ -123,6 +157,29 @@ int str_replace(str *s, char *substr, char *replacement) { assert(s && substr && replacement); - // - return 0; + int substr_len = strlen(substr); + int replacement_len = strlen(replacement); + int count = 0; + + str temp; + str_init(&temp); + + int pos = 0; + int found_pos; + + while ((found_pos = str_find(s, substr)) != -1) { + str_append_n(&temp, s->ptr + pos, found_pos - pos); + str_append(&temp, replacement); + pos = found_pos + substr_len; + count++; + } + + if (pos < s->len) { + str_append_n(&temp, s->ptr + pos, s->len - pos); + } + + str_set(s, str_data(&temp)); + str_deinit(&temp); + + return count; } diff --git a/str.h b/str.h index 8cf04b4..355e22a 100644 --- a/str.h +++ b/str.h @@ -60,3 +60,4 @@ str str_sub(str *s, int start_idx, int length); //В результате в строке &s должна получиться строка "test bar baz test", //функция должна вернуть 2 int str_replace(str *s, char *substr, char *replacement); + diff --git a/str_test b/str_test new file mode 100755 index 0000000000000000000000000000000000000000..88f298980b30772b21ac3c08f996ab2131e3473b GIT binary patch literal 25960 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 XCw7IA9$$0GZ@*S^Omhjin#TVDj11Mx literal 0 HcmV?d00001