2

私は C が初めてで、この問題に取り組む最善の方法を見つけようとしています。両方の文字列が 2 つありますchar *

文字列自体に複数の \n 文字があり、通常、長さは約 1000 文字です。異なる 1 行だけを表示したい。通常、文字列全体で異なるのは 1 文字 (または比較的少数) だけです。そのため、変更された 1 行 (\n から \n への文字列全体) のみを表示できるようにしたいと考えていました。

コードを書いたり、コード例を提供したりすることを誰かに求めているわけではありません。理論的には、これを行う最も効率的な方法は何でしょうか?

strtok を使用し、'\n' 記号を区切り記号として使用し、strcmp を使用して 2 つの文字列を比較し、それらが等しくない場合は、その文字列を "old_data" と "new_data" に追加することを検討してきました。 " 配列。これは悪い方法でしょうか?

どんなアドバイスも大きな助けになります。

4

2 に答える 2

1

strtok()は再入可能ではありません。strtokを使用してこれを行う場合は、配列を次々に繰り返す必要があります。strtokの再入可能な実装であるstrtok_r()を使用することをお勧めします。

心配する必要があるもう1つの考慮事項は、old_data配列とnew_data配列が十分に大きいか、サイズ変更可能であることを確認することです。Mattの答えは、配列のサイズ変更の簡単な例を示していますが、Cを初めて使用する場合は、次のように宣言するだけです。

char *new_data[2000];
char *old_data[2000];

特に、バッファ内の行数を把握しているように思われるためです。

于 2012-12-17T22:36:53.773 に答える
1

正しい軌道に乗っているように聞こえstrsepます。改行で文字列をチャンクアップできます。覚えておくべきことの 1 つは、元の文字列を元の場所で操作し、新しいメモリを割り当てないことです。これは、祝福と呪いの両方になる可能性があります。

おそらくこれを行うための最もメモリ効率の良い方法は、「old_data」と「new_data」の値を保持するポインターの配列の割り当てを調べ、文字列自体をコピーするのではなく、元の文字列を直接指すポインターを保存することです。 . 元の 2 つの文字列が残り続けるか、解放されない限り、これによりかなりの量のメモリを節約できます。

配列から文字列を削除するつもりがない場合、配列を実装する単純な (しかし効果的な) 方法の 1 つは、カウントと容量の 2 つの状態変数を維持し、移動するたびに容量を 2 倍にすることです。配列をオーバーフローさせます。例えば:

char **strArray = NULL;
unsigned int capacity = 10;
unsigned int count = 0;

strArray = malloc(capacity * sizeof(char *));

/* on insert */
if (count == capacity)
{
    capacity *= 2;
    strArray = realloc(strArray, capacity * sizeof(char *));
}

strArray[count++] = pointerIntoOriginalString;

幸運を!

于 2012-12-17T22:32:53.657 に答える