一个简单的 C++ 字符串生成器






1.57/5 (14投票s)
2004年5月7日
2分钟阅读

70907
关于一个简单字符串生成器的文章。
引言
当我们需要搜索服务器中的用户帐户等内容时,需要生成字符串进行检查(我称之为种子)。通过以下代码,您可以获得一个顺序字符串。 就像这样:如果您用 'ab' 初始化您的种子字符串,那么以下代码将生成 ac、ad、...az、aaa、aab...,循环遍历 ch[0x100] 中所有可能的组合,但不包括 '\0'。 您需要做的是选择一个字符集合,即哪些字符将参与排列;这是一个重复组合,如果您想要不重复的组合,可以在 Google 上搜索,我曾经见过,但现在记不起来了。
使用代码
因此,如果您需要重复排列,可以考虑使用以下代码片段。 首先,您选择字符集合并对其进行初始化,这里我使用 [a-z]。 之后,您需要初始化种子。 然后,代码将进入循环,为您生成下一个组合。 结果字符串保存在 szitem
中。 您可以在搜索字符串中使用它。 例如,您可以将其构建为 "rcpt to:<" + szitem + "@maildomain.com>\r\n",然后发送到 smtp 服务器。 如果您想要 ANSI 字符串,可以相应地进行更改,这里我使用 UNICODE。 我想您不需要我再做这个了 :-) 无论如何,如果需要什么,请发邮件给我 我。
#define ENUMCHARCOUNT 26 WCHAR ch[0x100]; for(int i=0;i<ENUMCHARCOUNT;i++) ch[i] = L'a'+i; for(int i=ENUMCHARCOUNT;i<0x100;i++) ch[i] = L'\0'; // the maximum length of result string seeds is 10. unsigned short seed[10]; for(int j=0;j<10;j++) seed[j] = 0xff; WCHAR szitem[10]; // initialize the seed here. so we will start from "ab". seed[0]= L'a'; seed[1]= L'b'; seed[2]= L'\0'; while(1) { if(seed[0]==ENUMCHARCOUNT) { seed[0] = 0; int kk = 1; while(1) { seed[kk]++; if(seed[kk]==0x100) // upgrade { seed[kk] = 0; break; } else if(seed[kk]==ENUMCHARCOUNT) // flat add { seed[kk] = 0; kk++; } else break; } } j=0; while(1) { szitem[j] = ch[seed[j]]; if(seed[j]==0xff) break; j++; } // // do sth with szitem // seed[0]++; }
在您使用生成的字符串种子执行一些操作之前,可以使用正则表达式或其他公式对其进行过滤,如果检查过程耗时较长(通常是这样)。
历史
几天前,我用这个从脚本引擎中提取命名项 ;-) 最后,您应该做的是剪切上面的代码,将其粘贴到您的应用程序源代码中,并在最后一行设置断点,按 F5,当它停止时,将 sztiem
拖到监视面板中。 然后您可以看到循环为您做了什么。 最后我想说的是,每个从事过搜索引擎开发的人,都必须做过类似的事情,但我找不到有人在这里发布过。 所以我自己做了。 非常感谢大家的评论! 祝大家周末愉快!