如何在C ++中的do-while循环结束时清除数组?

时间:2015-06-18 05:04:03

标签: c++ arrays recursion do-while

我的功能的目的是生成8个随机字母n次(编译时指定)。我通过编写两个名为genNumbers的函数来实现这一点 - 它生成8个随机数(0到25之间),并将它们放入一个名为numbers的数组中,convert - 转换每个数字数组到字母表中相应的字母,并将这些字母放入一个名为letters的数组中。这两个功能完美运行,我多次测试它们。

现在我在main中实现它们时遇到了麻烦。

我希望main接受一个参数,该参数指定需要多少个letters数组。因此,例如调用a.out 3会输出类似

的内容
SAFJPONG   1
VYREMNXZ   2
QWMKUZXC   3

这就是我的主要内容:

int numbers[8];
string letters[8];

void genNumbers() {
int i;

srand (time(NULL));

for (i = 0; i < 8; i++) {
    numbers[i] = rand() % 25;
}
}

void convert() {
int i;

for (i = 0; i < 8; i++) {
    if (numbers[i] == 0) {
        letters[i] = "A";
    }
    else if (numbers[i] == 1) {
        letters[i] = "B";
    }
    else if (numbers[i] == 2) {
        letters[i] = "C";
    }
    else if (numbers[i] == 3) {
        letters[i] = "D";
    }
    else if (numbers[i] == 4) {
        letters[i] = "E";
    }
    else if (numbers[i] == 5) {
        letters[i] = "F";
    }
    else if (numbers[i] == 6) {
        letters[i] = "G";
    }
    else if (numbers[i] == 7) {
        letters[i] = "H";
    }
    else if (numbers[i] == 8) {
        letters[i] = "I";
    }
    else if (numbers[i] == 9) {
        letters[i] = "J";
    }
    else if (numbers[i] == 10) {
        letters[i] = "K";
    }
    else if (numbers[i] == 11) {
        letters[i] = "L";
    }
    else if (numbers[i] == 12) {
        letters[i] = "M";
    }
    else if (numbers[i] == 13) {
        letters[i] = "N";
    }
    else if (numbers[i] == 14) {
        letters[i] = "O";
    }
    else if (numbers[i] == 15) {
        letters[i] = "P";
    }
    else if (numbers[i] == 16) {
        letters[i] = "Q";
    }
    else if (numbers[i] == 17) {
        letters[i] = "R";
    }
    else if (numbers[i] == 18) {
        letters[i] = "S";
    }
    else if (numbers[i] == 19) {
        letters[i] = "T";
    }
    else if (numbers[i] == 20) {
        letters[i] = "U";
    }
    else if (numbers[i] == 21) {
        letters[i] = "V";
    }
    else if (numbers[i] == 22) {
        letters[i] = "W";
    }
    else if (numbers[i] == 23) {
        letters[i] = "X";
    }
    else if (numbers[i] == 24) {
        letters[i] = "Y";
    }
    else {
        letters[i] = "Z";
    }
}
}

int main(int argc, char * argv[]) {
 int i = 0;
 int g,n;

if (argc == 2 && argv[1][0] > 0) {
    n = atoi(argv[1]);

    do {
        genNumbers();
        convert();
        for (g = 0; g < 8; g++) {
            cout << letters[g];     // this is where I believe the problem is
        }
        cout << "   " << i+1 << endl;
        i++;
    }
    while (i < n);
}

return 0;
}

当我运行a.out 3时,我的输出如下:

SAFJPONG   1
SAFJPONG   2
SAFJPONG   3

显然,我的主要是每次返回相同的letters数组,而不是像我想要的那样创建3个不同的数组。

我评论了我认为我的问题出现的地方。我觉得它与删除数组有关,所以每次都要创建一个新数组。谁能发现我哪里错了?

1 个答案:

答案 0 :(得分:3)

这是我如何实现相同的程序。我认为代码string letters[8];中的第二行有些可疑。您还可以查看genNumbersconvert功能。

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

int nums[8];
char letters[9];

void genNumbers() {
    for (int i=0; i<8; i++)
        nums[i] = rand()%26;
}

void convert() {
    for (int i=0; i<8; i++)
        letters[i] = 'A' + nums[i];
}

int main(int argc, char **argv) {
    letters[8] = '\0';
    srand(time(NULL));
    int n = 0;
    if (argc == 2) {
        n = atoi(argv[1]);
        for (int i=0; i<n; i++) {
            genNumbers();
            convert();
            printf("%s\n", letters);
        }
    }
    return 0;
}

修改

srand(time(NULL))函数中对genNumbers的调用出错了。每次调用genNumbers时调用它都会导致重置种子,从而重新启动伪随机数序列。即使您将时间用作种子,它也会给出相同的数字,因为此代码的执行速度很快,时间差异可以忽略不计。如果您在代码中调用usleep(1000000);之类的内容,则代码将起作用,因为它会导致函数调用之间的时间差异很大。例如:此代码产生所需的结果:

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

int nums[8];
char letters[9];

void genNumbers() {
    srand(time(NULL));
    for (int i=0; i<8; i++)
        nums[i] = rand()%26;
}

void convert() {
    for (int i=0; i<8; i++)
        letters[i] = 'A' + nums[i];
}

int main(int argc, char **argv) {
    letters[8] = '\0';
    int n = 0;
    if (argc == 2) {
        n = atoi(argv[1]);
        for (int i=0; i<n; i++) {
            genNumbers();
            convert();
            printf("%s\n", letters);
            usleep(1000000);
        }
    }
    return 0;
}

修改

如果您仍想避免在主要内容中调用srand(),那么您可以在genNumbers本身执行此操作:

void genNumbers() {
    srand(time(NULL)*rand()); // notice time(NULL)*rand()
    for (int i=0; i<8; i++)
        nums[i] = rand()%26;
}