多维char数组 - 如何用随机字符填充它?

时间:2011-05-13 05:56:45

标签: c++ random char generator

所以我试图创建一个像:

这样的生成器
#include <iostream>
#include <iomanip>  
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
char* data;
void genRandomFilledChar(char *s, int i, int j, int k) { 
    const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
    for (int q = 0; q < i; ++q) {
        for (int w = 0; w < j; ++w) {
            for (int e = 0; e < k; ++e) {
                s[e] = alphanum[rand() % (sizeof(alphanum) - 1)];
            }
        } }}

int main()
{
    data =  new char[10000][10000][10000];
    genRandomFilledChar(data, 10000, 10000, 10000);
    cin.get();
    return 0;
}

但它无法编译。我做错了什么?

5 个答案:

答案 0 :(得分:2)

你不能像你那样分配新阵列。您应该声明一个适当大小的一维数组或创建指向数组的指针数组。

char *data = new char [1000*1000*1000]; 

char ***data = new char**[1000];
for (int i=0; i< 1000; i++) {
    data[i] = new char*[1000];
    for (int j=0; j< 1000; j++) {
        data[i][j] = new char[1000];
    }
} 

您在genRandomFilledChar中也有错误。每次只填充10000个具有随机值的字符。

而且,最后一个。对于rand(),您需要使用srand初始化随机生成器。

答案 1 :(得分:1)

char* data;
// ....
data =  new char[10000][10000][10000];

错了。首先,字符的三维数组是char***。接下来,您需要分三步初始化该内存。

data = new char**[10000];
for(int i=0; i < 10000; ++i){
  data[i] = new char*[10000];
  for(int j=0; j < 10000; ++j){
    data[i][j] = new char[10000];
    for(int k=0; k < 10000; ++k){
      // and for best performance, initialize directly
      data[i][j][k] = /*HERE*/;
    }
  }
}

答案 2 :(得分:1)

s[e] = alphanum[rand % (sizeof(alphanum) - 1)];

应该是

s[q][w][e] = alphanum[rand % (sizeof(alphanum) - 1)];

因为它是一个三维数组

答案 3 :(得分:1)

由于new char[10000][10000][10000]的类型为char (*)[10000][10000],而char*的类型为data。而且我认为你想要的是

void genRandomFilledChar(char *s, int i, int j, int k) { 
    const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
    for (int q = 0; q < i; ++q) {
        for (int w = 0; w < j; ++w) {
            for (int e = 0; e < k; ++e) {
                s[e + w * k + q * j * k] = alphanum[rand() % (sizeof(alphanum) - 1)];
            }
        }
    }
}

int main()
{
    data =  new char[10000 * 10000 * 10000];
    genRandomFilledChar(data, 10000, 10000, 10000);
    cin.get();
    return 0;
}

答案 4 :(得分:1)

C多维数组只是一种自动计算索引的方法。 为什么不声明char数据[i * j * k](或从堆中获取新的),然后将其填充为单维度?稍后您可以将[] [] []索引与数据一起使用。