我需要帮助来过滤C语言中的坏词?

问题描述 投票:0回答:1

如您所见,我正在尝试过滤各种不良词。我有一些代码可以这样做。我正在使用C,这也适用于GTK应用程序。

char LowerEnteredUsername[EnteredUsernameLen];
for(unsigned int i = 0; i < EnteredUsernameLen; i++) {
    LowerEnteredUsername[i] = tolower(EnteredUsername[i]);
}
LowerEnteredUsername[EnteredUsernameLen+1] = '\0';
if (strstr(LowerEnteredUsername, (char[]){LetterF, LetterU, LetterC, LetterK})||strstr(LowerEnteredUsername, (char[]){LetterF, LetterC, LetterU, LetterK})) {
    gtk_message_dialog_set_markup((GtkMessageDialog*)Dialog, "This username seems to be innapropriate.");
    UsernameErr = 1;
}

我的问题是,它只会过滤if语句中指定的最后一个坏词。在此示例中,为“ fcuk”。如果我输入“ fuck”,则代码会将其作为干净代码传递。我该如何解决?

c string filter string-matching
1个回答
0
投票

[在C语言中进行人工语言文本处理非常痛苦,因为C的字符串概念(即char* / char[]wchar_t* / wchar_t[])非常低级,不足以表达[代表Unicode文本,更不用说在文本中定位单词边界并匹配已知字典中的单词了(还应考虑到词尾变化,偏斜,复数,使用变音符号来避免幼稚的字符串匹配)。简而言之:如果需要,请避免在C中执行此操作,然后使用健壮且功能齐全的Unicode处理库(即,不要使用C标准库的字符串函数,例如strstrstrtokstrlen,等等。

这是我的处理方式:

    将输入读入包含Unicode文本(大概是UTF-8)的二进制Blob。
  1. 使用Unicode库执行以下操作:
    1. 标准化编码的Unicode文本数据(请参见https://en.wikipedia.org/wiki/Unicode_equivalence]
  2. 确定单词边界(假设我们正在处理使用由单词组成的句子的欧洲语言)。
  3. 使用语言学图书馆和数据库(英语中有很多特殊情况)来规范化每个单词。
  4. 然后在不区分大小写的已知“坏词”哈希集中查找每个词。
© www.soinside.com 2019 - 2024. All rights reserved.