char *example
20 文字を含むがあるとします。example[5]
toからすべての文字を削除してからexample[10]
、配列を修正して、 のexample[11]
直後に配置したいと考えていexample[4]
ます。
基本的に、削除された領域の後のすべての文字を、削除された領域が開始された時点にシフトします。
何か案は?
編集:memcpyを使用する方法があると思いますか? しかし、私はそれを行う方法がわかりません。
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)
ネタバレ:
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;
}
memmove(&example[5], &example[11], strlen(example) - 11 + 1);
memcpy
メモリブロックがオーバーラップするときのの動作は未定義であるため、memmove
ここではより適切であることに注意してください。
何か案は?
並列配列を準備し、ソース配列からすべての文字をコピーしますが、指定された範囲内のそれらの文字は無視します。必要に応じて、ソース配列がスタック上にない場合、ソース配列で使用されているメモリを解放できます。