2016-11-23 8 views
-2

文字列を関数に渡し、ポインタを使って配列の最初の要素を指すようにしました。 どのように配列の各要素をポイントし、不要な文字を削除するのですか? ではなく、で、角かっこなどの変数をこのポインタと多分別のポインタを使用して試しています。C++で指されている配列の要素を削除する方法

ありがとうございました。

+2

「文字を削除する」とはどういう意味ですか?配列のサイズは固定されているため、エントリを削除することはできません。エントリを置き換えることはできますが、決して配列のエントリを削除することはできません。本当に本当に要素を削除したいなら、 'std :: string'のようなコンテナを使います。 – PaulMcKenzie

+0

私は参照してください。私が要素aabbccbccdを持つchar配列を持っていて、すべての要素を削除したいのであればb。配列の各要素を指すポインタを使用しています。これらの要素を配列で削除するにはどうすればよいですか?私は角括弧を使わないようにしています。 – Andrew

+0

[ベクトルから要素を消去する]の複製があります(http://stackoverflow.com/questions/347441/erasing-elements-from-a-vector) –

答えて

0

あなたが本当にあなたのやり方でそれをやりたいのであれば、新しい文字配列を宣言して、あなたのポインタを介して配列を反復することによって配列に残したい文字の要素を数えなければなりません。その数は新しい配列のサイズになります。

例:上記のスニペットで

char b[] = "acbbca"; 
char* p = &b[0]; 
int oldsize = 6; 
int newsize = 0; 
for (int a = 0; a < oldsize; a++) 
{ 
    if(*p!='b') 
     newsize++; // increment the newsize when encountered non-b char 
    p++; 
} 

、あなたは非B文字数を数えるので、新しい配列のサイズになります。

p = &b[0]; // point again to the first element of the array. 
char newone[size]; declare the new array that will hold the result 
int ctr = 0; 
for (int a = 0; a < oldsize; a++) 
{ 
    if(*p!='b') 
    { 
     newone[ctr] = *p; //store non-b characters 
     ctr++; 
    } 
    p++; 
} 

上記のスニペットでは、すべての非b文字を新しい配列に格納します。

別の方法はstd :: stringを使用することです。

std::string b = "aabbcc"; 
b.erase(std::remove(b.begin(),b.end(),'b'),b.end()); 
+0

配列から要素を削除するために、そのコードをすべて必要とするわけではありません。どちらのループも必要ありません。 'std :: remove'のようなSTLアルゴリズム関数は、通常の配列で動作します。 – PaulMcKenzie

0

配列のサイズを変更することはできませんので、本当に「削除要素」のようなものはありません。要素を実際に削除するには、要素を実際に削除できるようなコンテナ、たとえばstd::stringを使用する必要があります。

これを仮定すると、配列を使用することができ、削除された値を配列の最後に移動し、次に削除された要素の開始点をポイントすることを意味します。 STLアルゴリズム機能std::removeは、これを実現するために使用することができます。

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    char letters[] = "aabbccbccd"; 

    // this will point to the first character of the sequence that is to be 
    // removed. 
    char *ptrStart = std::remove(std::begin(letters), std::end(letters), 'b'); 

    *ptrStart = '\0'; // null terminate this position 
    std::cout << "The characters after erasing are: " << letters; 
} 

出力:

The characters after erasing are: aaccccd 

Live Example

std::removeはただの最後に削除したい文字や場所、それを取ります配列。 std::removeの戻り値は、削除された要素が配置された配列 のポイントです。基本的に戻り値は、破棄された要素の開始位置を指します(要素は実際には破棄されません)。私たちは、最初の要素へのポインタを渡す

void erase_element(char *ptr, char erasechar) 
{ 
    char *ptrStart = std::remove(ptr, ptr + strlen(ptr), erasechar); 
    *ptrStart = '\0'; // null terminate this position 
} 

Live Example 2

、と判断するためにstrlen()関数を使用する:あなたは今、これを行うための関数を書く場合

だから、それはおそらく、このようになります。文字列の長さ(関数は文字列がNULLで終了しているとみなします)。

関連する問題