9

私は持っています

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

すべての要素を個別に別の配列にコピーする以外にsubstriing(i,j)、簡単な方法はありますか?tいいえstringsなどだけchar t[200]です。

4

6 に答える 6

7

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

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

std::stringとはいえ、頭痛を自分で使用して保存できないのはなぜですか?

于 2013-03-23T12:11:43.940 に答える
5
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;
}
于 2014-04-04T16:10:59.863 に答える
3

データを読み取るだけでよい場合は、 t+i が必要です。残念ながら、部分文字列の長さを管理する必要があります...

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

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

于 2013-03-23T12:13:47.950 に答える
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];
于 2013-03-23T12:24:07.650 に答える
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;
于 2013-03-23T12:12:31.853 に答える
1

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;
于 2013-03-23T13:07:30.297 に答える