簡體   English   中英

如何從C中的字符串中刪除某些字符?

[英]How can I remove certain characters from a string in C?

我有包含 HTML 標簽的字符串(例如: "<p>sample_text</p>" )。 我想從字符串中刪除這些標簽,如下面的偽代碼所示:

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
}

我怎么能讓這個工作?

您正在朝着正確的方向思考,您只是混淆了刪除的邏輯。 在您認為標簽是is_deleting的情況下,您只想在不刪除時復制字符。

而不是考慮如果你的病情is_deleting為什么不考慮你是否intag 至少在迭代字符時,在 at 標記中忽略字符或不在標記復制字符中似乎更具描述性。

不管你對當前角色有 3 個條件。 它是 (1) 一個'<'表示您將intag標志設置為 true 的標簽打開,或 (2) intag標志為 true 並且當前字符是'>'標記標簽的關閉,或 (3 ) intag為假,您正在復制字符。 您可以按如下方式實現該邏輯:

循環遍歷任何字符串中的字符時,無需使用strlen() 空終止字符為您標記字符串的結尾。

如果你把它放在一起,你可以這樣做:

#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。請參閱Parse html using C ,尤其是 gumbo-parser。在這個有限的簡單示例中 - 它是微不足道的,但是跨越多行的嵌套標簽使這項工作迅速復雜化。使用驗證 html 的庫)

示例使用/輸出

$ ./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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM