将一个字符追加到列表中n次。

4

我希望创建随机数据进行测试。我想用字母 'A' 填充一个包含 100 个随机长度的字符串数组。

示例:

array[0] = "AAAAA"
array[1] = "AAAAAAAA"
array[2] = "A"
...

char **create_string()
{
    char **array = malloc(sizeof(**array)); 

    srand((unsigned int)time(NULL));
    int random = 0;

    int i, j;
    for(int i=0; i<100; i++)
    {
        random = rand() % 100;
        for(j=0; j < random; j++)
        {
           array[i] = // some sort of string append that would be cheap.
        }
    }
}

我在查看这个C字符串追加的问题,他们使用了strcat。有没有更好的方法来解决我的问题?因为我将在循环中运行以创建那些随机大小的字符串。

6个回答

3
#include  <stdio.h>
#include <stdlib.h>
#include <time.h>
char **create_string(size_t n) {
    char **array = malloc(sizeof(char*) * n); 
    int i, j;
    for(i=0; i<100; i++)
    {   
        size_t sz = rand() % 100;
        array[i] = malloc(sz + 1); 
        for(j=0; j < sz; j++) {
            array[i][j] = 'A';
        }
        array[i][sz] = 0;
    }   
    return array;
}

int  main() {
    char **array;
    size_t i;
    srand((unsigned int)time(NULL));
    array = create_string(100);
    for (i = 0; i < 100; i++)
        printf("%s\n", array[i]);
    return 0;    

} 

另一种方法是创建一个模板字符串,并将所需数量的字符复制到每个随机字符串中:

char **create_string(size_t n) {
    char template[101];
    char **array = malloc(sizeof(char*) * n); 
    int i;

    for (i = 0; i < 100; i++)
        template[i] = 'A';
    template[100] = 0;
    for(i = 0; i < n; i++) {
        size_t sz = rand() % 100;
        array[i] = malloc(sz + 1); 
        strncpy(array[i], template, sz);
        array[i][sz] = 0;
    }   
    return array;
}

为什么你在第二个里面没有使用srand()函数? - noufal
@noufal,应用程序中一次对srand的调用通常足够了,在这两种情况下都在主函数中调用。 - perreal

0

这将取决于您想要的字符串长度分布。这是一个从0到200的字符串长度均匀分布。

int n = rand() % 200 * sizeof(*array);
array[i] = malloc(n + 1);
memset(array[i], 'A', n);
array[i][n] = '\0';

但你可以有一个高斯分布,泊松分布等。


0
 char **create_string()
  {
  char **array = malloc(sizeof(char *) * 100);

             srand((unisgned int)time(NULL));

        int i;
        for (i = 0; i <100;i++)
        {
            int random = rand() % 100;
            array[i] = malloc(random);
            memset(array[i],'A',random-1);
            array[random-1] = '\0';
        }
        return array;
    }

你需要解决的问题是:如果随机数为0会发生什么?此外,随机数不会均匀分布。只有对2的幂取模才能实现这一点。

0
这里有一种方法,不对任何单个字符串设置上限,但确实对所有字符串的总长度设置了一个确切的上限。它还只调用了malloc两次。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TOT_SIZE (5000) /* adjust to taste */
#define TOT_STRS (100)

char **create_strings()
{
    char **array = (char**) malloc(TOT_STRS * sizeof(char *));
    char *str    = (char*)  malloc(TOT_SIZE);
    int  zeros   = 1;
    int  i;

    memset(str, 'A', TOT_SIZE - 1);

    str[TOT_SIZE - 1] = 0;

    while (zeros < TOT_STRS)
    {
        int pos = rand() % TOT_SIZE;

        if (str[pos] != 0)
        {
            str[pos] = 0;
            zeros++;
        }
    }

    array[0] = str;

    for (i = 1; i < TOT_STRS; i++)
    {
        array[i] = array[i - 1] + strlen(array[i - 1]) + 1;
    }

    return array;
}

还有一个简短的测试程序:

int main()
{
    char **a = create_strings();
    int i;

    for (i = 0; i < TOT_STRS; i++)
    {
        printf("%3d: %s\n", i, a[i]);
    }

    return 0;
}

这段代码假设所有随机字符串都需要是不重叠的。如果它们可以在内存中重叠,你只需要一个字符串和一个指向该字符串不同起始点的指针数组。


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

char **create_string(const size_t array_size,
               const size_t string_size,
               const unsigned char chr)
{

    srand((unsigned)time(NULL));
    char ** array = malloc(array_size * sizeof (char *));

    size_t t;

    for (t = 0; t < array_size; ++t) {
        array[t] = malloc(string_size * sizeof(char));
        array[t][string_size] = '\0';
        memset(array[t], chr, (rand() % string_size) + 1);
    }

    return array;   
}

main() {

    char ** randstring = create_string(10, 7, 'A');
    int t = 0;
    for (; t < 10; ++t)
        printf("%s\n", randstring[t]);
    return 0;
}

可能的输出

AAAAAA
AAAAA
AAAAAA
AAA
AAAAA
AAAAAA
AAAAAA
AAAAAAA
AAAA
AAAA

你的字符串没有以\0结尾。 - AndersK

0

你不需要分配真正的100个字符串。首先,你只需声明一个足够长的数组char long_array[100]。然后使用random = rand() % 100;获取随机数。其次,你只需将long_arrayrandom传递给你的函数。这样你的问题就解决了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接