2013-03-23 23 views
5

mampodłańcuchem char [] w C++

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].

+6

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

+2

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.) –

Odpowiedz

5

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?

0

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; 
2

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ć.

2

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]; 
+1

Dlaczego 'malloc' kiedy masz' new'? – deepmax

1

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; 
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; 
} 
+1

Czy możesz podać więcej szczegółów na temat swojej odpowiedzi oprócz kodu, który już tam jest? –