好的,我一直试图找到解决问题的方法。问题是: 鉴于3个字母单词的列表(列表的大小与我认为无关),如何识别列表中与列表中的第一个单词不同的单词最多一个字母。 说我有帕特这个词 然后我想确定列表中的所有单词:
付费等 p_t如锅 _ot如rot有没有办法在c ++中实现通配符?
答案 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个(按相同顺序)所需的测试组合为:
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
}
}