char t[200];
cin.get(s, 200);
int i = 5;
int j = 10;
Czy jest jakiś prosty sposób na uzyskanie substriing(i,j)
z t
przy kopiowaniu każdy element oddzielnie do innej tablicy? No strings
itp. Po prostu char t[200]
.
char t[200];
cin.get(s, 200);
int i = 5;
int j = 10;
Czy jest jakiś prosty sposób na uzyskanie substriing(i,j)
z t
przy kopiowaniu każdy element oddzielnie do innej tablicy? No strings
itp. Po prostu char t[200]
.
Jeśli możesz zmodyfikować t
, możesz ustawić t[j]
na 0
, a następnie użyć t + i
, aby uzyskać podciąg.
Jeśli nie, będziesz musiał zrobić kopię.
To powiedziawszy, dlaczego nie możesz po prostu użyć std::string
i oszczędzić sobie bólu głowy?
nie zrobić jakieś granice kontroli w celu zapewnienia tablicy docelowej jest wystarczająco
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;
duża Jeśli potrzebne jest tylko do odczytu danych, a następnie t + i to, co chcesz, niestety będziesz musiał zarządzać długość swojej podciąg ...
char *sub = t+i;
int len = j-i;
printf("%.*s\n",len,sub);
Jeśli musisz mieć wyraźną kopię fragmentu, a następnie trzeba skopiować.
To powinno zadziałać:
#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]='\0';
cout << to;
}
Można użyć new
zamiast malloc
takiego:
char* to = new char[j-i+1];
Dlaczego 'malloc' kiedy masz' new'? – deepmax
Zastosowanie dwa wskaźniki do określenia zakresu, w ciągu.
char const * beg = t+i;
char const * end = t+j+1;
std::cout.write(beg, end-beg);
Lub możesz użyć klasy, która zawiera ten pomysł. Do standardowej biblioteki jest proponowana something like that. W międzyczasie możesz napisać własną lub możesz użyć jej z biblioteki. Na przykład: llvm::StringRef
.
llvm::StringRef sref(t+i, j+1-i);
std:cout << sref;
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;
}
Czy możesz podać więcej szczegółów na temat swojej odpowiedzi oprócz kodu, który już tam jest? –
To jest zbyt ogólnikowe. Do jakiego celu? Możesz po prostu przekazać indeksy (początek, koniec) do funkcji wymagającej podłańcucha, wraz z 't' ... – Synxis
Problem polega na tym, że standardowy ciąg" C "jest zakończony znakiem NUL. Oznacza to, że jeśli na przykład weźmiesz podciąg od 5 do 10, nie tylko musisz mieć adres piątej litery (łatwy do wykonania), ale musisz także wstawić wartość zerową po dziesiątym. To "tupie" na oryginalnej tablicy. Aby wykonać "właściwe" zadanie, należy skopiować ciąg. (Ale jeśli reszta tablicy jest "wyrzucana", wtedy możesz pracować z oryginalnego bufora.) (Istnieje również kwestia zakresu, którą należy wziąć pod uwagę, oczywiście - tablica znaków (nie wskaźnik) "istnieje" tylko w metodzie deklarującej to.) –