[英]removing all sub strings of a string in C
我一直试图从给定的字符串中删除所有出现的 substring 但我的代码有一个我不知道如何解决的错误。 当两个子字符串背靠背时,我的代码只能删除其中一个。
这是我的代码:
void removeSub(char *str, char *sub, char *new) {
int len = strlen(sub);
char *subp = strstr(str, sub);
int position = subp - str;
for (int i = 0; i <= strlen(str); i++) {
if (i >= position && i < position + len) {
continue;
}
if (i == position + len - 1) {
// update position
subp = strstr(str + i - 1, sub);
position = subp - str;
}
char ch = str[i];
strncat(new, &ch, 1);
}
}
代码的快速解释:我将字符串 char 逐个字符地复制到另一个字符串(新)中,每当我看到 substring 时,我的代码继续循环并且什么都不做。 当通过 substring 时,我重新定位下一个 substring。 (我知道这不是很有效,但我是新手,不知道很多方法和功能)
问题是循环不断前进。 当您删除 substring 时,您需要从循环索引i
中减去一个,以便再次搜索相同的 position。
您的代码有多个问题:
for (int i = 0; i <= strlen(str); i++)
的循环效率非常低,因为在循环的每次迭代中都会重新计算str
的长度。 你应该简单地写:
for (int i = 0; str[i];= '\0'; i++)
当您跳过匹配的 substring 时,复制它之后的字符并且i
在循环中递增,因此下一次出现的测试未正确测试。
append 的代码单个字符效率低下:而不是strncat(new, &ch, 1);
你应该有一个指向目标字符串末尾的指针并写*p++ = str[i];
并在循环结束后设置 null 终止符。
这是修改后的版本:
#include <string.h>
// remove all occurrences of sub in str into destination buffer new
// return a pointer to the destination string
char *removeSub(cont char *str, const char *sub, char *new) {
char *p = new;
size_t len = strlen(sub);
if (len > 0) {
const char *subp;
while ((subp = strstr(str, sub)) != NULL) {
memcpy(p, str, sub - str);
p += sub - str;
str = sub + len;
}
}
strcpy(p, str);
return new;
}
还有一个没有库调用的替代方案:
// remove all occurrences of sub in str into destination buffer new
// return a pointer to the destination string
char *removeSub(cont char *str, const char *sub, char *new) {
char *p = new;
while (*str) {
if (*str == *sub) { /* potential substring match */
for (size_t i = 1;; i++) {
if (sub[i] == '\0') { /* substring match */
str += i;
break;
}
if (str[i] != sub[i]) {
*p++ = *str++;
break;
}
}
} else {
*p++ = *str++;
}
}
*p = '\0';
return new;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.