删除C中字符串的所有子字符串
我一直试图从给定字符串中删除所有出现的子字符串,但我的代码有一个bug,我不知道如何解决。当两个子字符串背对背时,我的代码只能删除其中一个子字符串 这是我的代码:删除C中字符串的所有子字符串,c,string,substring,C,String,Substring,我一直试图从给定字符串中删除所有出现的子字符串,但我的代码有一个bug,我不知道如何解决。当两个子字符串背对背时,我的代码只能删除其中一个子字符串 这是我的代码: 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 <
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);
}
}
void removeSub(char*str、char*sub、char*new){
int len=strlen(sub);
char*subp=strstrstr(str,sub);
int位置=subp-str;
对于(int i=0;i=position&&i
代码的快速解释:我将字符串逐字符复制到另一个字符串(新)中,每当我看到子字符串时,我的代码将继续循环,而不执行任何操作。当传递一个子字符串时,我重新定位下一个子字符串。(我知道这不是很有效,但我是新手,不知道很多方法和功能)问题是循环不断前进。删除子字符串时,需要从循环索引
i
中减去一个子字符串,以便再次搜索同一位置。您的代码有多个问题:
- 代码> >(int i=0);我是否在调试器中运行代码,一步一步地检查代码变量的值?如果没有,然后考虑这样做。这有帮助。当代码>子< /代码>不在<代码> STR < /代码>时,会发生什么?在代码>之后,您有一个额外的分号(I==位置+LeN-1)。“<代码> >如果有一个“空”语句,下面的块在代码> {}} /代码> s将无条件地执行。@当我在这里复制代码时,我删除了一个注释,它是代码的一部分,这是发生的,这不是从字符串中删除子串的问题,考虑子串<代码>“伤害”。,是否要删除
(如果它显示为一个单词)以及“harm”
它是另一个单词中包含较少的字符串吗?这确实有帮助,感谢你,这曾经是一个被接受的答案,直到更好的答案出现。我注意到了错误,尝试进行了一个小的更正,在拉字符串时发现我将重写算法,决定OP自己做会受益更多。哈他没有评论,我不会删除它。中的“harm”
for (int i = 0; str[i] != '\0'; i++)
#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; }