严格来说,您没有实现子字符串的删除:您的代码打印了删除了一系列字符的原始字符串。
另一件需要注意的是,根据您的示例,索引p
是从 1 开始的,而不是像在 C 中那样从零开始。否则,输出 for"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
:这只是一种优化,没有它你的代码也可以正常工作。
n
目前,当is时,您的代码将打印原始字符串两次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
d 。
这是ideone 上此修改版本的演示。