2013-03-23 8 views
5

に私はサブストリングは、[] C++

char t[200]; 
    cin.get(s, 200); 
    int i = 5; 
    int j = 10; 

を持っている別の配列に別々にすべての要素をコピー横にtからsubstriing(i,j)を取得する任意の簡単な方法はありますか?いいえstringsなどchar t[200]だけです。

+6

これはあまりにも曖昧です。何のために? 't'と一緒に部分文字列を必要とする関数にインデックス(start、end)を渡すことができます... – Synxis

+2

問題は、標準Cの"文字列 "がNULLで終了するということです。これは、例えば、5から10までの部分文字列を取る場合、5文字目のアドレスを持つ必要があるだけでなく、10文字目以降にnullを配置する必要があることを意味します。これは、元の配列に「踏みつぶし」ます。だから、 "適切な"仕事をするためには、文字列をコピーする必要があります。 (配列の残りの部分が "スローアウェイ"であれば、元のバッファから作業することができます。)(もちろん、スコープの問題もあります。 –

答えて

5

tの変更が許可されている場合は、t[j]0に設定し、t + iを使用して部分文字列を取得できます。

そうでない場合は、コピーを作成する必要があります。

つまり、なぜstd::stringを使用して頭痛を救うことができないのですか?

0

これは、コピー先の配列を使用して、データを読み取るためにのみ必要な場合は、管理する必要があります悲しいかな、その後のt + iは、あなたが望むものである

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

十分な大きさであることを確認するチェック任意の境界を行いません。部分文字列の長さ...

char *sub = t+i; 
int len = j-i; 
printf("%.*s\n",len,sub); 

部分文字列の別個のコピーが必要な場合は、コピーする必要があります。

2

これは正常に動作する必要があります:

#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; 
} 

をあなたはこのようnewの代わりmallocを使用することができます。

char* to = new char[j-i+1]; 
+1

なぜ 'malloc'が' new'を持っているのでしょうか? – deepmax

1

使った文字列内の範囲を示すために二つのポインタ。

char const * beg = t+i; 
char const * end = t+j+1;  
std::cout.write(beg, end-beg); 

また、このアイデアをカプセル化したクラスを使用することもできます。標準ライブラリにはsomething like thatが提案されています。その間は、自分で書くことも、ライブラリから使うこともできます。たとえば、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

あなたはすでにそこにあるコードに加えて、あなたの答えについての詳細を提供できますか? –