在c ++中使用通配符识别相关单词

时间:2013-03-02 01:03:36

标签: c++ wildcard

好的,我一直试图找到解决问题的方法。问题是: 鉴于3个字母单词的列表(列表的大小与我认为无关),如何识别列表中与列表中的第一个单词不同的单词最多一个字母。 说我有帕特这个词 然后我想确定列表中的所有单词:

付费等 p_t如锅 _ot如rot

有没有办法在c ++中实现通配符?

2 个答案:

答案 0 :(得分:0)

尝试查看 strcmp 函数以及此处列出的一些其他相关函数:http://www.cplusplus.com/reference/cstring/strcmp/

....或者你可以像Tony the Lion刚才所说的那样使用正则表达式

编辑: ....也是 strcspn 功能

http://www.cplusplus.com/reference/cstring/strcspn/

/* strcspn example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "fcba73";
  char keys[] = "1234567890";
  int i;
  i = strcspn (str,keys);
  printf ("The first number in str is at position %d.\n",i+1);
  return 0;
}

<强>输出:

str中的第一个数字位于第5位

还有 strstr ,它在str2中找到str1的第一个出现。

例如:

 string str1 = "po";
 string str2 = "potlock";

 char * pch;
  pch = strstr (str2,str1);

第二次编辑:

你绝对可以用

进行循环
if (strcspn (str1,str2)){
    //there is at least one match
}else {

//no matches

}

答案 1 :(得分:0)

[这可能比分配要求更复杂,但它避免了慢速字符串比较和正则表达式]

鉴于所有内容都是3个字母的单词,您可以考虑将每个单词表示为4字节整数。例如,在“pat”中,字母'p'是0x70(ascii),'a'是0x61而't'是0x74,因此用整数0x706174表示“pat”。对测试列表中的所有3个字母的单词也一样。

接下来,要匹配的3个字母中的2个(按相同顺序)所需的测试组合为:

  • p?t,其中测试是0x70 ?? 74
  • ?在哪里测试是0x ?? 6174
  • PA?测试的位置是0x7061 ??

PS我可以添加一下stackoverflow'代码示例'按钮,它假设将您的选择重新格式化为代码在Firefox中很奇怪。这篇1分钟的帖子花了20分钟格式化!

// assume array words[] of strings
int word0 = calc_int_from_word(words[0]);

for (int ii = 1; ii < words.count; ii++)
{
  int wordii = calc_int_from_word(words[ii]);

  if (wordii & 0xFFFF00 == word0 & 0xFFFF00 ||
      wordii & 0xFF00FF == word0 & 0xFF00FF ||
      wordii & 0x00FFFF == word0 & 0x00FFFF)
  {
    // words[ii] matches words[0] in at least two letters
  }
}