如何在 C++ 中的 do-while 循环结束时清除数组?
How do I clear an array at the end of a do-while loop in C++?
我这个函数的目的是n次生成8个随机字母(编译时指定)。我通过编写两个名为 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
很明显,我的 main 每次都返回相同的 letters
数组,而不是像我想要的那样创建 3 个不同的数组。
我已经评论了我认为我的问题出现的地方。我觉得这与必须删除数组有关,以便每次都创建一个新数组。谁能发现我哪里出错了?
下面是我如何实现相同的程序。我认为您的代码中的第二行有些可疑 string letters[8];
。另外,您可能需要检查 genNumbers
和 convert
函数。
#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] = '[=10=]';
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;
}
编辑:
你在 genNumbers
函数中调用 srand(time(NULL))
出错了。每次调用 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] = '[=11=]';
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;
}
编辑:
如果您仍想避免在 main 中调用 srand()
,那么您可以在 genNumbers
中执行以下操作:
void genNumbers() {
srand(time(NULL)*rand()); // notice time(NULL)*rand()
for (int i=0; i<8; i++)
nums[i] = rand()%26;
}
我这个函数的目的是n次生成8个随机字母(编译时指定)。我通过编写两个名为 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
很明显,我的 main 每次都返回相同的 letters
数组,而不是像我想要的那样创建 3 个不同的数组。
我已经评论了我认为我的问题出现的地方。我觉得这与必须删除数组有关,以便每次都创建一个新数组。谁能发现我哪里出错了?
下面是我如何实现相同的程序。我认为您的代码中的第二行有些可疑 string letters[8];
。另外,您可能需要检查 genNumbers
和 convert
函数。
#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] = '[=10=]';
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;
}
编辑:
你在 genNumbers
函数中调用 srand(time(NULL))
出错了。每次调用 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] = '[=11=]';
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;
}
编辑:
如果您仍想避免在 main 中调用 srand()
,那么您可以在 genNumbers
中执行以下操作:
void genNumbers() {
srand(time(NULL)*rand()); // notice time(NULL)*rand()
for (int i=0; i<8; i++)
nums[i] = rand()%26;
}