Я уже написал ответ для аналогичной проблемы там https://stackoverflow.com/a/42283266/6003870. Он подходит для общих действий и основан в основном на функции strncpy () из стандартной библиотеки C.
Но эту проблему можно решить с помощью функции memmove () , как упомянуто мертвым пользователем @ sharptooth.
Функция str_slice_in_place () использует memmove () в качестве базы и поддерживает положительные индексы.
int
str_slice_in_place(char str[], const int index_from, const int index_to)
{
// a support for only positive indexes
if (index_from < 0 || index_to < 0)
return -1;
int len = index_to - index_from;
// "index_from" is more than "index_to"
if (len < 0)
return -1;
memmove(str, str + index_from, len);
str[len] = '\0';
return 0;
}
Я также покажу вам код функции main () и примеры использования этой функции.
#include <stdio.h>
#include <string.h>
int
main()
{
char line[] = "--------------------------------------";
char str1[] = "Remember a good";
char str2[] = "Remember a good";
char str3[] = "Remember a good";
char str4[] = "Remember a good";
printf("| Original | Slice | Result \n%s\n", line);
printf("| %s | ", str1);
str_slice_in_place(str1, 0, 8);
printf("(%d, %d) | %s\n", 0, 8, str1);
printf("| %s | ", str2);
str_slice_in_place(str2, 3, 9);
printf("(%d, %d) | %s\n", 3, 9, str2);
printf("| %s | ", str3);
str_slice_in_place(str3, 0, 1);
printf("(%d, %d) | %s\n", 0, 1, str3);
printf("| %s | ", str4);
str_slice_in_place(str4, 1, 1);
printf("(%d, %d) | %s\n", 1, 1, str4);
puts(line);
return 0;
}
Выход
| Original | Slice | Result
--------------------------------------
| Remember a good | (0, 8) | Remember
| Remember a good | (3, 9) | ember
| Remember a good | (0, 1) | R
| Remember a good | (1, 1) |
--------------------------------------
Среда тестирования
$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.6 (jessie)
Release: 8.6
Codename: jessie
$ uname -a
Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux