0

char *example20 文字を含むがあるとします。example[5]toからすべての文字を削除してからexample[10]、配列を修正して、 のexample[11]直後に配置したいと考えていexample[4]ます。

基本的に、削除された領域の後のすべての文字を、削除された領域が開始された時点にシフトします。

何か案は?

編集:memcpyを使用する方法があると思いますか? しかし、私はそれを行う方法がわかりません。

4

5 に答える 5

4

memcpy()ソースとターゲットが重複しているため、確実に使用することはできません。を使用できますmemmove()。あなたは長さを知っているので、あなたは以下を使います:

memmove(&example[5], &example[11], (20 - 11 + 1));

nullターミネータもコピーする必要があることを忘れないでください。

#include <string.h>
#include <stdio.h>

int main(void)
{
    char array[] = "abcdefghijklmnopqrst";
    char *example = array;
    printf("%.2zu: <<%s>>\n", strlen(example), example);
    memmove(&example[5], &example[11], (20 - 11 + 1));
    printf("%.2zu: <<%s>>\n", strlen(example), example);
    return(0);
}

C99コンパイラでコンパイルすると、次のようになります。

20: <<abcdefghijklmnopqrst>>
14: <<abcdelmnopqrst>>

C89コンパイラ(より具体的にはCライブラリ)を使用している場合は、引数zを示すフォーマット文字列のを気にする必要があります。size_tを削除して、 withzの結果をキャストするのが最も簡単です。strlen()(unsigned)

于 2012-09-15T19:41:41.357 に答える
1

ネタバレ:

void cut_the_string(char *str, size_t cutpos, size_t cutlen)
{
  size_t len;

  len = strlen(str);

  if (cutpos >= len) return;
  if (cutpos + cutlen > len) cutlen = len-cutpos;

  memmove( str+cutpos, str+cutpos+cutlen, 1+len - cutpos - cutlen);

  return;
}
于 2012-09-15T19:48:09.273 に答える
0
memmove(&example[5], &example[11], strlen(example) - 11 + 1);

memcpyメモリブロックがオーバーラップするときのの動作は未定義であるため、memmoveここではより適切であることに注意してください。

于 2012-09-15T20:32:58.317 に答える
0

何か案は?

並列配列を準備し、ソース配列からすべての文字をコピーしますが、指定された範囲内のそれらの文字は無視します。必要に応じて、ソース配列がスタック上にない場合、ソース配列で使用されているメモリを解放できます。

于 2012-09-15T19:11:27.050 に答える
0
  1. ループ内で文字をシフトする OR
  2. 例 +11..例 +20 の文字をコピーし、例 +4 に貼り付けます。
  3. ....
于 2012-09-15T19:10:47.230 に答える