2016-12-04 68 views
0

我正在嘗試使用兩個for循環來生成一個隨機的3到9個字符範圍內的單詞序列,並將運行總共1000次。如何使用Rand函數生成一個長度範圍爲3到9個字符的隨機單詞?

inner for loop會生成一個隨機單個字母,然後它將組合生成3-9個字符的單詞。

到目前爲止,我有:

#include <stdio.h> 
#include <time.h> 

int main() 
{ 
    int i, j; 
    int RandomNumber; 
    char letter[0]; 
    char word[8]; 
    char testword[4] = "test"; 

    // generate random word 

    for (j = 3; j < 10; j++) { 
     RandomNumber = rand() % 26; 
     printf("%d", RandomNumber); 
     word[j] = 'a' + RandomNumber; 
     printf("Word: %s", word[j]); 
    } 

    return 0; 
} 
+0

你應該看看[適當的C格式](// prohackr112.tk/r/properties-formatting)。或者學習如何[徹底模糊你的代碼](// prohackr112.tk/r/proper-c-obfuscation)。 –

+0

生成不同長度的單詞是沒有用的,因爲一個'N'字母的字符比'N + 1'字母的字符小很多。如果你正在做密碼,你需要至少80位,更好的是128. – o11c

+0

'char word [8];'then'for(j = 3; j <10; j ++)... word [j ] ='a'+ RandomNumber;'***看到問題了嗎?***你在哪裏存儲'word [8]'和'word [9]'?這些索引是否超出'word'數組的末尾?那麼讓'word'成爲一個字符串所需要的* nul-terminator *呢?可以容納它的最後一個位置是「字[7]」。 「字[0-2]」中發生了什麼? –

回答

1

繼續從我的意見,你正在使用的for (j = 3; j < 10; j++)你的循環索引目前超越的word界限。您另外不知道word[0-2]中的內容是什麼,因爲word未初始化,您從不填充任何內容的索引0-2。此外,在C中,當您聲明char word[8];時,只有8個字符,您可以將其添加到word的索引0-7中。

如果打算使用陣列作爲字符串,然後C要求字符串是空終止(例如具有NUL字節,即0'\0'(它們是等效的)作爲字符串的最後一個字符)。嘗試使用word作爲字符串而不空終止未定義行爲(如呼籲wordprintf("Word: %s", word[j]);沒有它空終止

你不需要兩個循環,你只需要一個隨機長度之間3-9爲您將生成的每個單詞。在進入循環以生成word的字符之前,可以單獨調用rand()

要解決所有的問題(並注意到rand()srand()列入stdlib.h),你可以做一些類似以下內容:

#include <stdio.h> 
#include <stdlib.h> /* for rand()/srand() */ 
#include <time.h> 

enum { MINW = 3, MAXW = 9 }; /* constants for min/max length */ 

int main (void) 
{ 
    int i, randlength; 
    char word[MAXW+1] = "";  /* initialize your variables */ 
    i = randlength = 0; 

    srand (time (NULL));  /* initialize the random number generator */ 
    randlength = rand() % (MAXW - MINW + 1) + MINW; /* randlength of 3-9 */ 
    printf ("length : %d\n\n", randlength); 

    for (i = 0; i < randlength; i++) { 
     int randomnumber = rand() % 26, 
      randchar = 'a' + randomnumber; 
     printf(" number[%2d] : %2d '%c'\n", i, randomnumber, randchar); 
     word[i] = randchar; 
    } 
    word[i] = 0; /* nul-terminate (note: also done by initialization) */ 
    printf ("\nWord : %s\n", word); 

    return 0; 
} 

示例使用/輸出

$ ./bin/randword  
length : 3 

number[ 0] : 8 'i' 
number[ 1] : 20 'u' 
number[ 2] : 0 'a' 

Word : iua 

$ ./bin/randword 
length : 8 

number[ 0] : 24 'y' 
number[ 1] : 13 'n' 
number[ 2] : 12 'm' 
number[ 3] : 14 'o' 
number[ 4] : 9 'j' 
number[ 5] : 6 'g' 
number[ 6] : 9 'j' 
number[ 7] : 12 'm' 

Word : ynmojgjm 

重要的是您瞭解以下注釋word[i] = 0;「也通過初始化完成」 。想想爲什麼那個顯式的終止可以在那裏消除。如果您有任何問題,請告訴我。