65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.57/5 (14投票s)

2004年5月7日

2分钟阅读

viewsIcon

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 拖到监视面板中。 然后您可以看到循环为您做了什么。 最后我想说的是,每个从事过搜索引擎开发的人,都必须做过类似的事情,但我找不到有人在这里发布过。 所以我自己做了。 非常感谢大家的评论! 祝大家周末愉快!

© . All rights reserved.