Как обрезать строку [from:to] в C++ для char[]?
Никак не могу найти возможность обрезать строку char[], начиная с элемента с индексом k, до элемента с индексом g. В Python это можно сделать с помощью string[from:to], можно ли что-то подобное сделать в C++?
Вот код, которым я пытался это сделать, но он ведет себя непредсказуемо странно при разных значениях переменной str:
#include <cstring>
#include <iostream>
int main()
{
char A[7];
char B[8];
char C[4];
char str[] = "AAAAABBBBCCC";
strncpy(A, str, 5);
strncpy(B, str+5, 4);
strncpy(C, str+5+4, 3);
std::cout << A << " " << B << " " << C << std::endl;
return 0;
}
Где на выходе я получаю странное:
AAAAA BBBB CCCРBBBB
[UPD] Решение, к которому я пришел:
#include <cstring>
#include <iostream>
void substr(char* dest, char* source, int from, int length){
strncpy(dest, source+from, length);
dest[length] = 0;
}
int main()
{
char A[7];
char B[8];
char C[4];
char str[] = "AAAAABBBBCCC";
substr(A, str, 0, 5);
substr(B, str, 6, 4);
substr(C, str, 6+4, 3);
std::cout << A << " " << B << " " << C << std::endl;
return 0;
}
Вывод в консоль: AAAAA BBBB CCC
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Руками, например:
char* slice(char*s, int from, int to)
{
int j = 0;
for(int i = from; i <= to; ++i)
s[j++] = s[i];
s[j] = 0;
return s;
};
Или с помощью memmove -
char* slice(char*s, int from, int to)
{
memmove(s,s+from, to-from+1);
s[to-from+1] = 0;
return s;
};
Проверки, что from, to в пределах строки и что from < to - допишите сами.
Можно - если это позволяет ваша задача - просто
char* slice(char*s, int from, int to)
{
s[to+1] = 0;
return s+from;
};
Ну, т.е. обрезать строку и обращаться по новому адресу :)