如何在 C 中创建随机字符串数组?

How to create array of random strings in C?

我尝试创建一个包含十个随机字符串的数组,这些随机字符串会随机打印方向。例如第一次 "up down right ... rot_x" 和第二次 "forward rot_y up ... down" 等。我尝试使用 char* pc 并使用 memset 为其分配内存,但这没有用,所以我尝试了以下代码,但我得到了奇怪的输出。我该如何解决这个问题?

int main()
{
  int r_num;
  char r_arr[10][10];

  for (int i = 0; i < 10; i++)
  {
    r_num = rand() % 10;

    switch(r_num)
    {
      case 0: strcpy(r_arr[0], "up");
              break;
      case 1: strcpy(r_arr[1], "down");
              break;
      case 2: strcpy(r_arr[2], "left");
              break;
      case 3: strcpy(r_arr[3], "right");
              break;
      case 4: strcpy(r_arr[4], "rot_x");
              break;
      case 5: strcpy(r_arr[5], "rot_y");
              break;
      case 6: strcpy(r_arr[6], "rot_z");
              break;
      case 7: strcpy(r_arr[7], "forward");
              break;
      case 8: strcpy(r_arr[8], "back");
              break;
      case 9: strcpy(r_arr[9], "reset");
              break;
      default:
        fprintf(stderr, "Cannot process input/n");
    }
  }

  for (int i = 0; i < 10; i++)
  {
    printf("%s ", r_arr[i]);
  }

  return 0;

}

这是我的输出:

up ?V? left right rot_x ?V?  forward back reset

打印开关内的字符串,而不是最后的 for 循环。

也许您还需要类似的东西:

srand (time(NULL));

正如评论者所指出的,您不是在随机化每个位置的值,而是在随机化哪些位置会填充其预设值。此外,您在这里使用 switch 语句很奇怪。尝试类似的东西:

char value_arr[10][10]={"up", "down", "left", "right", "rot_x", "rot_y", "rot_z", "forward", "back", "reset"}

 for (int i = 0; i < 10; i++)
  {
    r_num = rand() % 10;
    strcpy(r_arr[i], value_arr[r_num]);
  }

您的代码存在一些问题:

  1. 您没有播种 rand(),因此您程序的每个 运行 都会生成相同的输出。您需要先将 srand() 与种子一起使用。传统上使用 time().
  2. 其次,尽管是随机的,但你是非随机的(这是一个词吗?)填充 r_arr"up" 永远排在第一位,"down" 永远排在第二位,等等……相反,你应该做类似

    的事情
    for (int = 0; i< 10; i++) {
       r_num = rand() % 10;
       strcpy(r_arr[i], getDirection(r_num));
    }
    

其中 getDirection() 将 return 基于整数输入的字符串(例如:通过将 0 与 "up" 相关联的 case 语句)。

  1. 您的 r_arr 需要初始化。您当前的代码无法保证数组中的每个条目在被访问之前都会填充字符。如果您实施建议 2,那么您就不会有问题。然而,今天您的代码正在访问可能未初始化的内存。

这是一个完全符合您需要的代码:

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

int main()
{
  // we use this instruction to get a random result each time we run the program 
    srand(time(NULL));
    int r_num;
    char r_arr[10][10];
// the dictionary array will be used to take from it the possible strings 
    char dictionary[10][10]={"up","down","left","right","rot_x","rot_x","rot_x","forward","back","reset"};
    int i=0;
    for(i=0; i<10; i++)
    {
      // r_num will be assigned randomly an index from dictionary tab
      // the general equation is (rand()%(max-min+1))+min to get a random value 
      // between max and min inclusive
        r_num=(rand()%(9-0+1))+0;
      // we will put the random string chosen in the array r_num each time 
        strcpy(r_arr[i],dictionary[r_num]);
    }
     // this loop will print the result 
    for(i=0; i<10; i++)
    {
        printf("r_arr[%d]=%s \n",i,r_arr[i]);
    }

    return 0;
}

正如上面其他人所指出的,您的问题是您没有使用循环的迭代次数为数组编制索引。你有:

case 0: strcpy(r_arr[0], "up");

而你应该有:

case 0: strcpy(r_arr[i], "up");

我想指出的另一件事是 rand() 使用线性方程(至少在许多系统上是这样)所以你不可能得到连续的两个偶数或两个奇数连续,这不是很随机。因此我建议像这样:

r_num = (rand() >> 8) % 10;

通过查看您的输出,我注意到一些奇怪的值,例如 ?v?, 问题是并非所有 0 到 9 之间的数字都会由 rand() 函数,这意味着对应的数组元素(对那些数字)将不会被初始化,因此它包含存储在该内存地址中的垃圾值。
我希望能解释为什么你会得到这些奇怪的值。