Подстрока 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;
}