如何从C中的字符串中删除某些字符?

如何从C中的字符串中删除某些字符?,c,string,char,remove,C,String,Char,Remove,我的字符串中有HTML标记(例如:“sample\u text”)。 我想从字符串中删除这些标记,如下面的伪代码所示: string(string input_string) { int i = 0 bool is_deleting = False while(i < length(input_string)) { if(input_string[i] == "<") {

我的字符串中有HTML标记(例如:
“sample\u text

)。 我想从字符串中删除这些标记,如下面的伪代码所示:

string(string input_string)
{
    int i = 0
    bool is_deleting = False
    
    while(i < length(input_string))
    {
         if(input_string[i] == "<")
         {
             is_deleting = True
         }
         
         if(is_deleting == True)
         {
             if(input_string[i] == ">")
             {
                 is_deleting = False
             }
             input_string[i] = ""
         }
         i += 1
     }
return input_string
}
字符串(字符串输入\u字符串)
{
int i=0
bool is_deleting=False
while(i<长度(输入字符串))
{
如果(输入字符串[i]=“”)
{
是否删除=错误
}
输入_字符串[i]=“”
}
i+=1
}
返回输入字符串
}

我怎样才能做到这一点呢?

您的思路是正确的,您刚刚混淆了删除的逻辑。在你认为标签为<代码> ISO删除< /代码>的情况下,只想在不删除时复制字符。

<>而不是考虑如果你的条件<代码>删除< /代码>为什么不考虑你是<代码>标签>代码>。至少在对字符进行迭代时,在At标记中忽略字符或不在标记中复制字符似乎更具描述性

无论如何,当前角色有3个条件。它可能是(1)标记标记关闭的
'
,或者(3)
intag
为假并且您正在复制字符。您可以按如下方式实现该逻辑:

在任何字符串中的字符上循环时,不需要使用
strlen()
。nul终止字符为您标记字符串的结尾

如果你把这些放在一起,你可以做到:

#include <stdio.h>

char *rmtags (char *s)
{
    int intag = 0,                      /* flag in-tag 0/1 (false/true) */
        write = 0;                      /* write index */
    
    for (int i = 0; s[i]; i++) {        /* loop over each char in s */
        if (s[i] == '<')                /* tag opening? */
            intag = 1;                  /* set intag flag true */
        else if (intag) {               /* if inside a tag */
            if (s[i] == '>')            /* tag close */
                intag = 0;              /* set intag false */
        }
        else                            /* not opening & not in tag */
            s[write++] = s[i];          /* copy to write index, increment */
    }
    s[write] = 0;                       /* nul-terminate s */
    
    return s;                           /* convenience return of s */
}

int main (void) {
    
    char s[] = "<p>sample_text</p>";
    
    printf ("text: '%s'\n", rmtags (s));
}

您不想重新发明解析html的轮子。请参阅,尤其是gumbo解析器。而对于一个简单的案例,您可以使用一对指针,或者像
strstr()
等工具。。如果您的情况不简单,请使用经过验证的解析器。以下是一个版本或您的版本,它具有使其工作所需的绝对最小更改:我们在删除时不将input_string[i]设置为nothing的原因是,它仍然会在字符串中留下一个空白点。相反,我们需要将所有字符向右移动,以消除空白点。但我们不希望每次删除一个字符时都移动字符串的剩余部分,因此,我们只需将每个字符复制到它所属的位置,除非我们正在删除。可能重复:@JerryJeremiah-如果您愿意,我会将您的最小更改作为另一个答案发布。
$ ./bin/html_rmtags
text: 'sample_text'
char *removetags(char *str, char opentag, char closetag)
{
    char *write = str, *read = str;
    int remove = 0;

    while(*read)
    {
        if(*read == closetag && remove)
        {
            read++;
            remove = 0;
        }
        if(*read == opentag || remove)
        {
            read++;
            remove = 1;
        }
        else
        {
            *write++ = *read++;
        }
    } 
    *write = 0;
    return str;
}