Cでは、ある配列に存在するすべての文字を別の配列から削除する方法は?
4 に答える
宿題のように聞こえますが、ここに解決策があります。
のように、256個のエントリの配列を作成しますchar set[256]
。最初の文字列を読み取ります。c
1に設定された文字ごとset[(unsigned char)c]
に。2番目の文字列を読み取ってコピーします。各文字についてはc
、set[c]
スキップしc
ます。
memset(set, 0, sizeof(set))
値を1に設定する前に、まず最初に行う必要があることを忘れて省略しました。
a1に存在するa0の文字を削除するとします。まず、各インデックスが文字であるブール配列を作成します。元。x ['c']は、'c'がa1で見つかった場合に真になります。次に、a0をループし、x配列をチェックして、charを保持またはトスする必要があるかどうかを確認します。必要に応じて、要素を削除して新しい配列を作成できます。これはO(n)操作である必要があります。
数値の場合:
それらを「削除」することはできませんが、それらを0
(または場合によっては削除を表すことができる他の値)に設定するか、2 つの配列のサブセットに属さない数値を含む新しい配列を作成することができます。
強引な方法は、2 つのネストされたfor
ループを使用することです。
それらがchar
s の場合:
左の共通サブセットに属さないすべての文字を「シフト」-「交換」-「移動」することでそれらを「削除」し、適切な場所にヌルターミネータを設定できます。(文字列リテラル ( ) をいじらない限り、これchar * p = "lala"
で問題ありません)。これにより、char
一般的なsがほとんどなくなります。
void remove_repeated(char* s, char* another)
{
// ... preparation with another... see other answers
for (pos = p = s; *p != 0; p++)
{
if (!macro_is_repeated(*p))
*pos++ = *p;
}
*pos = 0;
}
その部分については他の回答を参照してくださいis_repeated
。