char t[200];
cin.get(s, 200);
int i = 5;
int j = 10;
を持っている別の配列に別々にすべての要素をコピー横にt
からsubstriing(i,j)
を取得する任意の簡単な方法はありますか?いいえstrings
などchar t[200]
だけです。
char t[200];
cin.get(s, 200);
int i = 5;
int j = 10;
を持っている別の配列に別々にすべての要素をコピー横にt
からsubstriing(i,j)
を取得する任意の簡単な方法はありますか?いいえstrings
などchar t[200]
だけです。
t
の変更が許可されている場合は、t[j]
を0
に設定し、t + i
を使用して部分文字列を取得できます。
そうでない場合は、コピーを作成する必要があります。
つまり、なぜstd::string
を使用して頭痛を救うことができないのですか?
これは、コピー先の配列を使用して、データを読み取るためにのみ必要な場合は、管理する必要があります悲しいかな、その後の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;
十分な大きさであることを確認するチェック任意の境界を行いません。部分文字列の長さ...
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];
なぜ 'malloc'が' new'を持っているのでしょうか? – deepmax
使った文字列内の範囲を示すために二つのポインタ。
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;
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;
}
あなたはすでにそこにあるコードに加えて、あなたの答えについての詳細を提供できますか? –
これはあまりにも曖昧です。何のために? 't'と一緒に部分文字列を必要とする関数にインデックス(start、end)を渡すことができます... – Synxis
問題は、標準Cの"文字列 "がNULLで終了するということです。これは、例えば、5から10までの部分文字列を取る場合、5文字目のアドレスを持つ必要があるだけでなく、10文字目以降にnullを配置する必要があることを意味します。これは、元の配列に「踏みつぶし」ます。だから、 "適切な"仕事をするためには、文字列をコピーする必要があります。 (配列の残りの部分が "スローアウェイ"であれば、元のバッファから作業することができます。)(もちろん、スコープの問題もあります。 –