This commit is contained in:
etrushko05
2025-10-18 06:05:03 -04:00
parent 5f66cc8eea
commit 93f4d98839
3 changed files with 72 additions and 14 deletions

85
str.c
View File

@@ -28,7 +28,10 @@ void
str_init(str *s)
{
assert(s);
// <YOURCODE>
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);
// <YOURCODE>
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);
// <YOURCODE>
return NULL;
return s->ptr;
}
void
str_set(str *s, char *cstr)
{
assert(s && cstr);
// <YOURCODE>
int len = strlen(cstr);
_str_ensure(s, len);
memcpy(s->ptr, cstr, len + 1);
s->len = len;
}
str
str_copy(str *s)
{
assert(s);
// <YOURCODE>
str new_str;
str_init_data(&new_str, s->ptr);
return new_str;
}
int
str_count(str *s, char ch)
{
assert(s);
// <YOURCODE>
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);
// <YOURCODE>
int len = strlen(cstr);
str_append_n(s, cstr, len);
}
void
str_append_n(str *s, char *cstr, int len)
{
assert(s && cstr);
// <YOURCODE>
_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);
// <YOURCODE>
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);
// <YOURCODE>
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);
// <YOURCODE>
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;
}

1
str.h
View File

@@ -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);

BIN
str_test Executable file

Binary file not shown.