2013-10-01 42 views
0

此代碼產生26 * 26 * 26 * 26 hasname(使用az的組合),或者您可以說我想分配給結構成員的隨機名稱。現在,當我通過首先分配該結構成員足夠的內存然後使用strcpy,只有由此代碼生成的最後一個哈希名正在傳遞給結構,即zzzz(它是最後一個哈希名)。我可以做什麼以便從起始位置分配哈希名。如何在C++中生成一組唯一的哈希字符串?

vcd_xyz[4] = '\0'; 
int count = 0; 
for(int i=0;i<26;i++) 
{ 
    vcd_xyz[0] = 'a'+i; 
    for(int j=0;j<26;j++) 
    { 
     vcd_xyz[1] = 'a'+j; 
     for(int k = 0;k<26;k++) 
     { 
      vcd_xyz[2] = 'a' + k; 
      for(int l=0;l<26;l++) 
      { 
       vcd_xyz[3] = 'a' +l; 
       count ++; 
       printf("%s\n",vcd_xyz); 
      } 
     } 
    } 
} 

所以我用

sss->Variables[0].hashname = (char*)calloc(strlen((char*)vcd_xyz)+1,sizeof(char)); 
strcpy(sss->Variables[0].hashname,(char*)vcd_xyz); 

複製產生的hasname但複製去年hashname產生,所以在以往任何時候我使用tr0->Variables[0].hashname = (char*)calloc(strlen((char*)vcd_xyz)+1,sizeof(char)); strcpy(tr0->Variables[0].hashname,(char*)vcd_xyz);只有ZZZZ得到printed.what我做錯了或我應該怎麼做,以便順序分配散列名。

+1

對不起,但...什麼? – LihO

+0

請寫出您是否需要C或C++解決方案,相應地移除其中一個標籤並編寫您正在使用的編譯器。 – LihO

+0

@LihO:或者會工作..因爲我正在g ++編譯 – shailendra

回答

0

首先你需要認識到char vcd_xyz[4]是一個4個字符的數組,這意味着你可以在那裏放置3個字符+終止字符'\0'。如果您將此數組當作空終止對象,則會導致未定義的行爲

你的代碼實際上做的是,它通過4個字母的長字符串的所有可能組合遍歷,從"aaaa""zzzz",留下vcd_xyz陣列充滿了最後的組合(即"zzzz")。


如果你想生成隨機的4字母的長字符串,這裏的C風格的功能,你可以使用:

int irand(int min, int max) { 
    return ((double)rand()/((double)RAND_MAX + 1.0)) * (max - min + 1) + min; 
} 

<min;max>區間生成隨機的數字,它可以這樣用:

std::string generateHashTag() { 
    char str[5]; 
    for (int i = 0; i < 4; ++i) 
     str[i] = irand('a', 'z'); 
    str[4] = '\0'; 
    return std::string(str); 
} 

,但如果你想生成一個一套獨特的4字母長哈希標籤,您將需要更復雜的解決方案。在C++中,你可以很容易地在一個循環中生成這些字符串,將它們放入一個容器中,直到你有足夠的容器,或者你可以生成這個字符串的更多獨特組合,將所有這些字符串放到一個std::vector中,隨機選取並挑選N ,例如:

const size_t N = 5; 
std::set<std::string> myHashTags; 

srand(time(0)); 
while (myHashTags.size() < N) 
    myHashTags.insert(generateHashTag()); 

for (std::set<std::string>::iterator i = myHashTags.begin(); 
    i != myHashTags.end(); ++i) 
    std::cout << *i << ' '; 

輸出kemy snwv vnmi wfmm wqeg。完整示例here

+0

我已經做了隨機字符變量,但我無法從他們這一代開始傳遞它們,而只傳遞最後生成的散列名。 – shailendra

+0

@ shailendra:你誤會了我。你沒有生成散列名,你只是遍歷所有可能的組合,以'zzzz'結尾。 – LihO

+0

好的..我仍然對此感到困惑,所以我怎麼能得到這些不同的散列名,當我用你的代碼和打印'str'它只打印一個隨機的名稱,如果可能的話,我如何使用我的代碼來生產hashname,而不是遍歷它們... – shailendra

相關問題