繼續從我的意見,你正在使用的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
作爲字符串而不空終止是未定義行爲(如呼籲word
printf("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;
「也通過初始化完成」 。想想爲什麼那個顯式的終止可以在那裏消除。如果您有任何問題,請告訴我。
你應該看看[適當的C格式](// prohackr112.tk/r/properties-formatting)。或者學習如何[徹底模糊你的代碼](// prohackr112.tk/r/proper-c-obfuscation)。 –
生成不同長度的單詞是沒有用的,因爲一個'N'字母的字符比'N + 1'字母的字符小很多。如果你正在做密碼,你需要至少80位,更好的是128. – o11c
'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]」中發生了什麼? –