私は持っています
char t[200];
cin.get(s, 200);
int i = 5;
int j = 10;
すべての要素を個別に別の配列にコピーする以外にsubstriing(i,j)
、簡単な方法はありますか?t
いいえstrings
などだけchar t[200]
です。
の変更が許可されている場合はt
、 に設定t[j]
してから0
、 を使用t + i
して部分文字列を取得できます。
そうでない場合は、コピーを作成する必要があります。
std::string
とはいえ、頭痛を自分で使用して保存できないのはなぜですか?
char* substr(char* arr, int begin, int len)
{
char* res = new char[len + 1];
for (int i = 0; i < len; i++)
res[i] = *(arr + begin + i);
res[len] = 0;
return res;
}
データを読み取るだけでよい場合は、 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]='\0';
cout << to;
}
次のようnew
に代わりに使用できます。malloc
char* to = new char[j-i+1];
これは、宛先配列が十分な大きさであることを確認するための境界チェックを行いません
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 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;