厳密に言えば、部分文字列の削除を実装していません。コードは、文字の範囲を削除して元の文字列を出力します。
注意すべきもう1つのことは、あなたの例によれば、インデックスp
はCのようにゼロベースではなく1ベースであるという"abcdefghi", 4, 3
こと"abcdhi"
です"abcghi"
。
これを念頭に置いて、いくつかの変更を加えてみましょう。まず、計算が少しずれています: 最後のループは次のようになります。
for (i = p+n-1; i < strlen(s); i++) {
printf("%c", s[i]);
}
ideone のデモ。
C のゼロから始まるインデックス スキームを使用する場合は、ループを次のように変更します。
for (i = 0; i < p; i++) {
printf("%c", s[i]);
}
for (i = p+n; i < strlen(s); i++) {
printf("%c", s[i]);
}
さらにif
、上部の から戻るか、次を追加する必要がありelse
ます。
if(n == 0) {
printf("%s", s);
return;
}
また
if(n == 0) {
printf("%s", s);
} else {
// The rest of your code here
...
}
または完全に削除しif
ます。これは最適化にすぎません。コードはそれがなくても正常に動作します。
現在、 is の場合、コードは元の文字列を 2 回出力しn
ます0
。
コードで部分文字列を削除して結果を返すようにしたい場合は、次のように結果を割り当て、印刷をコピーに置き換える必要があります。
char *remove_substring(char *s, int p, int n) {
// You need to do some checking before calling malloc
if (n == 0) return s;
size_t len = strlen(s);
if (n < 0 || p < 0 || p+n > len) return NULL;
size_t rlen = len-n+1;
char *res = malloc(rlen);
if (res == NULL) return NULL;
char *pt = res;
// Now let's use the two familiar loops,
// except printf("%c"...) will be replaced with *p++ = ...
for (int i = 0; i < p; i++) {
*pt++ = s[i];
}
for (int i = p+n; i < strlen(s); i++) {
*pt++ = s[i];
}
*pt='\0';
return res;
}
この新しいバージョンのコードは、動的に割り当てられたメモリを返すことに注意してください。これは、free
使用後に削除する必要があります。
これは ideone のこの修正版のデモです。