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

时间:2015-01-15 21:55:00

标签: c arrays string random

我尝试创建一个由十个随机字符串组成的数组,可以随机打印方向。比如第一次"向上向下......向下..."第二次"向前rot_y向上......向下"我尝试使用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

6 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  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));
    }
    
  3. 其中getDirection()将基于整数输入返回一个字符串(例如:通过将0与"up"相关联的case语句)。

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

答案 1 :(得分:1)

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

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

你应该有:

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

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

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

答案 2 :(得分:0)

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

也许你还需要这样的东西:

srand (time(NULL));

答案 3 :(得分:0)

正如评论者指出的那样,你随机化的不是你在每个位置放置的值,而是哪些位置充满了预设值。此外,您在这里使用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]);
  }

答案 4 :(得分:0)

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

#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;
}

答案 5 :(得分:0)

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