繁体   English   中英

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

[英]How to create an array of 100 random strings in C

我正在尝试在C中创建一个100个字符串的数组,这些字符串的大小在3到10个字母之间,但是有点麻烦。 这是我到目前为止所拥有的...

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

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

首先,如您所知,不要写到randomWord[count] ,这样以后就不能打印出结果了。

其次,您需要使用\\0结束每个字符串,并且应该使用printf("%s\\n", randomWord[count]); ,即没有&%s 不终止字符串并将其用在printf("%s"...很可能会产生不确定的行为;当打印字符串时,请使用%s而不是%d ;当使用%sprintf需要指向第一个字符的指针当您定义char *randomWord[100]randomWord[count]代表指向字符的指针,而&randomWord[count]代表指针的地址,而不是字符串的第一个字符。

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之间的随机长度。

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

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

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

我不会像其他答案一样耕作。 您现在了解:

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

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

与其从运算中发明每个字符,不如简单地从文字A-Za-z0-9 (或您希望包括的任何字符集)中选择一个随机索引,可能会更容易。 这实际上是“一对一的六”,是“另一半的六”,但是从概念上讲,跟踪您的工作可能更容易。

在寻找替代方案之前,让我们在代码中使用幻数来解决。 (不要这样做)。 如果您需要在代码中使用常量,请#define常量或使用全局enum执行相同的操作。 例如,如果您需要常量来生成字符串的最小长度 (例如MINL )和最大长度MAXL或最大字符串数MAXS (以及要从NCHR选择的字符数),则可以使用以下方法简单地定义常量:

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

这样,您就可以在代码顶部有一个方便的位置,可以根据需要调整值-无需遍历变量和循环声明即可。

现在替代。 您可以简单地声明一个字符串文字alpha其中包含您希望从中创建100随机字符串的字符。 然后,所需要做的就是为每个变量分配一个随机长度,分配length + 1个字节的存储空间,并创建介于0NCHR - 1之间的length随机数NCHR - 1将字符分配给字符串中的索引,并在末尾进行nul终止。

注意:通过使用calloc ,您已经在每个字符串的最后一个字节中填充了零,有效地提供了nul终止,但是最好对每个字符串进行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

查看所有答案。 提出了好观点。 如果您还有其他疑问,请告诉我们。

存在多个问题:

  • 您不将字符存储到分配的数组中。
  • 您计算出的一个随机字母太少,从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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM