好的,我一直在尝试解决我的问题。问题是:给定一个包含 3 个字母的单词列表(我认为列表的大小无关紧要),我如何识别列表中与列表中第一个单词最多相差一个字母的单词。假设我有 pat 这个词,那么我想识别列表中的所有词:
pa_ 如付 p_t 如 pot _ot 如 rot
有没有办法在 C++ 中实现通配符?
[这可能比赋值要求更复杂,但它避免了缓慢的字符串比较和正则表达式]
鉴于所有内容都是 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
}
}
尝试查看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可以找到 str1 在 str2 中的第一次出现。
例如:
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
}