如何在C中创建100个随机字符串的数组

时间:2017-11-01 21:43:13

标签: c arrays string random malloc

我试图在C中创建一个包含3到10个字母之间的100个随机大小的字符串,但是我有点麻烦。这就是我到目前为止......

int main() {
    int count, number;
    char *randomWord[100]; // 1-d array of pointers to char
    char randomLetter;
    int wordLength;

    // generate 100 strings or random sizes between 3 and 10 letters
    for (count = 0; count < 100; count++) {
        wordLength = ((rand() % 10) + 3);  // get random size of word
        randomWord[count] = malloc(wordLength + 1); // allocated space for word
        for (number = 1; number < wordLength; number++) {
            randomLetter = 'A' + (rand() % 26);
            //randomWord[count] =
            printf("%d\n", randomLetter);
        }

        printf("%d\n", &randomWord[count]);
    }
}

我得到的输出看起来像这样......

72
90
82
73
87
75
66
65
6356712
88
66
71
70
67
66
67
69
89
72
74
6356716
71
73
88
87
6356720

任何帮助或指示都将不胜感激。

4 个答案:

答案 0 :(得分:2)

首先,正如您所知,您不会写入randomWord[count],因此您无法在以后打印出结果。

其次,您需要使用\0终止每个字符串,并且您应该使用printf("%s\n", randomWord[count]);,即不使用&%s。不终止字符串并在printf("%s"...中使用它很可能产生未定义的行为;打印字符串时,请使用%s,而不是%d。使用%s时,printf需要指向字符串第一个字符的指针。正如您定义的char *randomWord[100]randomWord[count]代表指向字符的指针,而&randomWord[count]代表指针的地址,而不代表字符串的第一个字符。< / p>

wordLength = ((rand() % 10) + 3);  // get random size of word
randomWord[count] = malloc(wordLength + 1); // allocated space for word
for(number = 0; number < wordLength; number++)
{
    randomLetter = 'A' + (rand() % 26);
    randomWord[count][number] = randomLetter;
    // printf("%c", randomLetter);
}
randomWord[count][wordLength] = '\0';
printf("%s\n", randomWord[count]);

顺便说一句:请注意(rand() % 10) + 3)提供312之间的随机长度,而不是310之间的长度。

答案 1 :(得分:0)

您实际上使用了错误的格式说明符:

%d用于输出带符号的十进制整数 %c用于输出字符。

您的内心printf应该成为:printf("%c\n", randomLetter)

答案 2 :(得分:0)

我不会用其他答案犁过同样的地方。你现在明白了:

printf("%d\n", &randomWord[count]);

正在尝试打印指针的地址 randomWord[count]而不是您尝试打印ASCII值的所有字符。请记住,&是一元运算符的地址,而*解除引用运算符。 (通过尝试使用%d格式说明符打印指针地址来调用未定义行为。使用%p打印地址)

不是从模数操作中创建每个字符,而是简单地从文字A-Za-z0-9(或您希望包含的任何字符集)中选择随机索引可能更容易。这真的是#6;六对一&#34; a&#34;半打到另一个&#34;,但概念上可以更容易地跟踪你在做什么。

在查看替代方案之前,请在代码中使用幻数来解决问题。 (不要这样做)。如果您需要在代码中使用常量,那么#define或使用全局enum来执行相同操作。例如,如果您需要生成最小长度的常量(例如MINL)和最大长度MAXL或最大字符串数MAXS(以及从NCHR)中选择的字符数,您可以使用以下命令定义常量:

enum { MINL = 3, MAXL = 10, NCHR = 62, MAXS = 100 };

通过这种方式,您可以在代码顶部找到一个方便的位置来根据需要调整值 - 而无需选择变量和循环声明来执行此操作。

现在替代方案。您可以简单地声明一个字符串文字alpha,其中包含您要创建的100随机字符串。然后,所需要的只是获得每个存储的随机长度,分配length + 1字节的存储空间,并在length0之间创建NCHR - 1个随机数,将字符分配给你的字符串中的索引和最后的nul终止。

注意:,通过使用calloc,您已经在每个字符串中填充了零的最后一个字节,有效地提供了nul-termination,但是肯定是nul-这是一个好习惯。终止每个字符串)

总而言之,您可以执行以下操作:

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

enum { MINL = 3, MAXL = 10, NCHR = 62, MAXS = 100 };

int main (void) {

    char *alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"  /* NCHR long literal */
                  "abcdefghijklmnopqrstuvwxyz"  /* of chars to shuffle */
                  "0123456789",
        *a[MAXS] = { NULL };        /* array of pointers to char  */
    int modlen = MAXL - MINL + 1;   /* mod length for 3 - 10 char */

    srand (time (NULL));            /* seed random number generator */

    for (int i = 0; i < MAXS; i++) {    /* loop to create MAXS strings */
        int len = rand() % modlen + MINL;       /* get length 3 - 10 */
        if (!(a[i] = calloc (len + 1, 1))) {    /* allocate memory */
            fprintf (stderr, "error: memory exhausted 'a[%d]'.\n", i);
            return 1;
        }
        for (int j = 0; j < len; j++)       /* loop over len chars */
            a[i][j] = alpha[rand() % NCHR]; /* assing char from alpha */
        a[i][len] = 0;              /* affirmatively nul-terminate */
    }

    for (int i = 0; i < MAXS; i++) {        /* output results */
        printf ("a[%2d] : %s\n", i, a[i]);
        free (a[i]);        /* don't forget to free your memory */
    }

    return 0;
}

示例使用/输出

$ ./bin/str_randshuffle
a[ 0] : KhwC0FhKv
a[ 1] : j4U4zwfHf
a[ 2] : vSd
a[ 3] : 4jWlzWJ725
a[ 4] : q9h
a[ 5] : sxYmHSZ1w
a[ 6] : WSPot
a[ 7] : hTD
a[ 8] : GXQ
a[ 9] : NJD3GksyYE
a[10] : dUvVGPrWe
....
a[92] : vHl5
a[93] : 5LZjkFYl
a[94] : Q4Y
a[95] : 67sWds
a[96] : YlQWDuFKV8
a[97] : PHJwrOLQ6b
a[98] : U0EPiarOi
a[99] : zyZ2gcB2aw

查看所有答案。有好的观点。如果您有任何其他问题,请告诉我们。

答案 3 :(得分:0)

存在多个问题:

  • 您不会将字符存储到已分配的数组中。
  • 你计算一个随机字母太少,在0开始循环会解决这个问题。
  • 你不打印单词,只打印他们的地址。

以下是修复代码的方法:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int count, number;
    char *randomWord[100]; // 1-d array of pointers to char

    // generate 100 strings or random sizes between 3 and 10 letters
    for (count = 0; count < 100; count++) {
        int wordLength = 3 + rand() % 8;  // get random word size in 3..10
        randomWord[count] = malloc(wordLength + 1); // allocated space for word
        for (number = 0; number < wordLength; number++) {
            randomWord[count][number] = 'A' + rand() % 26;
        }
        randomWord[count][number] = '\0';
        printf("%s\n", randomWord[count]);
    }
    return 0;
}