[英]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.