Подстрока char[] в c++
Я
char t[200];
cin.get(s, 200);
int i = 5;
int j = 10;
есть ли простой способ сделать substriing(i,j)
С t
помимо копирования каждого элемента отдельно в другой массив? Нет!--3--> etc. просто char t[200]
.
6 ответов
Если вам разрешено изменять t
, вы можете установить t[j]
to 0
и затем использовать t + i
получить подстроку.
если нет, вам придется сделать копию.
что сказал, Почему вы не можете просто использовать std::string
и избавить себя от головной боли?
Если вам нужно только прочитать данные, то t+i-это то, что вы хотите, увы, вам придется управлять длиной вашей подстроки...
char *sub = t+i;
int len = j-i;
printf("%.*s\n",len,sub);
Если вам нужна отдельная копия подстроки, вы должны скопировать.
это должно работать нормально:
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
char t[200];
cin.get(t, 200);
int i = 5;
int j = 10;
char *to = (char*) malloc(j-i+1);
strncpy(to, t+i, j-i);
to[j-i]='';
cout << to;
}
можно использовать new
вместо malloc
такой:
char* to = new char[j-i+1];
используйте два указателя для обозначения диапазона внутри строки.
char const * beg = t+i;
char const * end = t+j+1;
std::cout.write(beg, end-beg);
или вы можете использовать класс, который инкапсулирует эту идею. Есть что-то подобное предлагается для стандартной библиотеки. Тем временем, вы можете написать свой собственный, или вы можете использовать один из библиотеки. Например, llvm::StringRef
.
llvm::StringRef sref(t+i, j+1-i);
std:cout << sref;
Это не делает никакой проверки границ, чтобы гарантировать, что целевой массив достаточно велик
char newt[200];
// copy j-i chars from position t+i to newt array
strncpy(newt, t + i, j-i);
// now null terminate
newt[j-i] = 0;
char* substr(char* arr, int begin, int len)
{
char* res = new char[len];
for (int i = 0; i < len; i++)
res[i] = *(arr + begin + i);
res[len] = 0;
return res;
}